package com.atguigu.javase.thread;/*** 创建并启动一个线程的方法*         1) 实现接口的方式*             1) 写一个具体类, 实现Runnable接口, 并实现其中的run方法,这个run方法就是线程的入口方法*          2) 创建这个类的对象, 并以这个对象为实参, 创建Thread类的对象*           3) 调用Thread对象的start()方法 启动线程**/
public class HelloRunner implements Runnable {private int n;@Overridepublic void run() {for (n = 0; n < 100; n++) {System.out.println(Thread.currentThread().getName() + ":" + n);}}
}package com.atguigu.javase.thread;public class HelloRunnerTest {public static void main(String[] args) {Runnable runnable = new HelloRunner();Thread thread = new Thread(runnable); // thread对象就是线程对象, 这个语句的执行相当于创建线程的栈//thread.run(); // 不会激活栈, 对于run方法只是一个普通方法调用thread.start();// 激活栈,并把run()方法压入栈底thread.setName("子线程1");/*Thread thread2 = new Thread(runnable);thread2.start();thread2.setName("子线程2");*/try {thread.join(); // 会引起当前线程阻塞, 直到子线程执行完毕} catch (InterruptedException e) {e.printStackTrace();} Thread.currentThread().setName("主线程");for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + ":" + i);}}
}import org.junit.Test;public class ThreadTest {//创建一个子线程,在线程中输出1-100之间的偶数,主线程输出1-100之间的奇数。@Testpublic void test() {Runnable print = new Print();Thread thread = new Thread(print);thread.setName("子线程---->");thread.start();Thread.currentThread().setName("主线程---->");for (int i = 0; i < 100; i++) {if (i % 2 != 0) {System.out.println(Thread.currentThread().getName() + i);}}}@Testpublic void test2() {Runnable print = new Print();Thread thread = new Thread(print);thread.setName("子线程1---->");thread.start();Runnable print1 = new Print1();Thread thread1 = new Thread(print1);thread1.setName("子线程2---->");thread1.start();}}
class Print implements Runnable {@Overridepublic void run() {for (int i = 0; i < 100; i++) {if (i % 2 == 0) {System.out.println(Thread.currentThread().getName() + i);}}}
}
class Print1 implements Runnable {@Overridepublic void run() {for (int i = 0; i < 100; i++) {if (i % 2 != 0) {System.out.println(Thread.currentThread().getName() + i);}}}
}package com.atguigu.javase.thread;/*** 创建线程的第二种方式:*        继承的方式*      1) 写一个具体类继承自Thread, 重写run方法, 这个run方法是真的入口*      2) 创建具体类对象, 相当于创建了Thread对象*         3) 调用Thread对象的.start()*/
class TestThread extends Thread {@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(currentThread().getName() + " : " + i);}}
}
public class ThreadTest {public static void main(String[] args) {new TestThread().start();for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + ":" + i);}}
}package com.atguigu.javase.thread;public class Counter implements Runnable {private int counter = 200;@Override//public synchronized void run() {public void run() {//synchronized (this) {// 锁的粒度大for (int i = 0; i < 50; i++) {//synchronized (锁对象) { // 锁对象必须是多个线程都使用同一个对象synchronized (System.in) {// 其中的语句具有原子性counter -= 2;try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " : " + counter);}}}
}package com.atguigu.javase.thread;public class CounterTest {public static void main(String[] args) {Counter counter = new Counter();Thread thread1 = new Thread(counter);thread1.setName("线程1");thread1.start();Thread thread2 = new Thread(counter);thread2.setName("线程2");thread2.start();}
}   package com.atguigu.javase.thread;import java.util.ArrayList;
import java.util.List;// sleep方法的使用
public class DataGetter implements Runnable {private boolean forOver = false;public boolean isForOver() {return forOver;}public void setForOver(boolean forOver) {this.forOver = forOver;}@Overridepublic void run() {List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < 100; i++) {int rand = (int)(Math.random() * 100);System.out.println(rand);list.add(rand);int randTime = (int)(Math.random() * 200);try {Thread.sleep(randTime);} catch (InterruptedException e) {System.out.println("在小睡[" + randTime + "]时被唤醒 , 小不爽");}}forOver = true;System.out.println("要长睡30秒...");try {Thread.sleep(30 * 1000);} catch (InterruptedException e) {System.out.println("在睡30秒时被唤醒 , 很不爽");}for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}package com.atguigu.javase.thread;public class DataGetterTest {public static void main(String[] args) {Runnable r = new DataGetter();Thread thread = new Thread(r);thread.start();Runnable r2 = new Monitor(r, thread);Thread thread2 = new Thread(r2);thread2.start();/*while (!((DataGetter)r).isForOver()) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}thread.interrupt();*/}
}package com.atguigu.javase.thread;public class SleepRunner implements Runnable {@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(i);try {Thread.sleep(100);} catch (InterruptedException e) {System.out.println("在睡100毫秒时被打断");} }System.out.println("要睡20秒");try {Thread.sleep(20 * 1000);} catch (InterruptedException e) {System.out.println("在长睡时被打断, 很不爽");}System.out.println("睡起来了...");}
}package com.atguigu.javase.thread;public class SleepRunnerTest {public static void main(String[] args) {Runnable r = new SleepRunner();Thread thread = new Thread(r);thread.start();try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt();}
}package com.atguigu.javase.thread;public class CanStopRunner implements Runnable {private int n = 0;private boolean stopFlag = false;public boolean isStopFlag() {return stopFlag;}public void setStopFlag(boolean stopFlag) {this.stopFlag = stopFlag;}@Overridepublic void run() { // 不是真的入口, 真的入口永远是Thread类中的run,while (!stopFlag) {System.out.println(Thread.currentThread().getName() + " : " + n++);if (n == 100) {n = 0;}}System.out.println("after while...");}
}package com.atguigu.javase.thread;public class CanStopTest {public static void main(String[] args) {Runnable r = new CanStopRunner();Thread t = new Thread(r);t.start();for (int i = 0; i < 1000000; i++) {int j = i + i;}// 线程的停止//t.stop();((CanStopRunner)r).setStopFlag(true); //以通知的方式停止线程}
}package com.atguigu.javase.thread;public class RandomRunner implements Runnable {private boolean stopFlag;public boolean isStopFlag() {return stopFlag;}public void setStopFlag(boolean stopFlag) {this.stopFlag = stopFlag;}@Overridepublic void run() {while (!stopFlag) {System.out.println((int)(Math.random() * 100));}}}package com.atguigu.javase.thread;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;public class KeyListener implements Runnable {private Runnable r;public KeyListener(Runnable r) {this.r = r;}@Overridepublic void run() {InputStream is = System.in;InputStreamReader isr = null;BufferedReader bufferedReader = null;try {isr = new InputStreamReader(is);bufferedReader = new BufferedReader(isr);String line = bufferedReader.readLine();while (line != null) {// 1)if (line.equalsIgnoreCase("Q")) {((RandomRunner)r).setStopFlag(true);//break;}// 2)line = bufferedReader.readLine();}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {try {bufferedReader.close();} catch (Exception e2) {// TODO: handle exception}}}}package com.atguigu.javase.thread;public class RandomRunnerTest {//在main方法中创建并启动1个线程。线程循环随机打印100以内的整数,直到主线程从键盘读取了“Q”命令。//在main方法中创建并启动两个线程。第一个线程循环随机打印100以内的整数,直到第二个线程从键盘读取了“Q”命令。public static void main(String[] args) {Runnable r = new RandomRunner();Thread t = new Thread(r);t.start();Runnable r2 = new KeyListener(r);Thread t2 = new Thread(r2);t2.setDaemon(true);t2.start();/*InputStream is = System.in;InputStreamReader isr = null;BufferedReader bufferedReader = null;try {isr = new InputStreamReader(is);bufferedReader = new BufferedReader(isr);String line = bufferedReader.readLine();while (line != null) {// 1)if (line.equalsIgnoreCase("Q")) {((RandomRunner)r).setStopFlag(true);break;}// 2)line = bufferedReader.readLine();}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {try {bufferedReader.close();} catch (Exception e2) {// TODO: handle exception}}*/}
}package com.atguigu.javase.thread;
// 创建一个账户类 ,实现取钱与存钱的同步操作
public class Account {private String name;private int balance;public Account() {}public Account(String name, int balance) {super();this.name = name;this.balance = balance;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getBalance() {return balance;}public void setBalance(int balance) {this.balance = balance;}@Overridepublic String toString() {return "Account [name=" + name + ", balance=" + balance + "]";}
}package com.atguigu.javase.thread;
// 存钱操作的处理
public class Deposit implements Runnable {private Account account;public Deposit(Account account) {this.account = account;}@Overridepublic void run() {for (;;) {synchronized ("") {int rand = (int)(Math.random() * 1000);account.setBalance(account.getBalance() + rand);System.out.println("存钱[" + rand + "]后" + ":" + account);"".notifyAll();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}package com.atguigu.javase.thread;
// 取钱操作的处理
public class Withdraw implements Runnable {private Account account;public Withdraw(Account account) {this.account = account;}@Overridepublic void run() {for (;;) {synchronized ("") {int rand = (int)(Math.random() * 100);while (rand > account.getBalance()) {try {"".wait();} catch (InterruptedException e) {e.printStackTrace();}}account.setBalance(account.getBalance() - rand);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("取钱[" + rand + "]后:" + account);}}}}package com.atguigu.javase.thread;public class AccountTest {public static void main(String[] args) {Account account = new Account("张三", 1000);Runnable runnable1 = new Deposit(account);Runnable runnable2 = new Withdraw(account);Thread t1 = new Thread(runnable1);Thread t2 = new Thread(runnable2);t2.start();t1.start();}
}package com.atguigu.javase.thread;
// notify方法的使用
public class PrintNumberRunner implements Runnable {private int i = 0;@Overridepublic void run() {for (;;) {synchronized ("") {"".notify(); // 必须是锁对象调用, 并且必须和wait方法的锁是同一把锁 并且此方法调用必须处于synchronized块中if (i == 100) {break;}i++;System.out.println(Thread.currentThread().getName() + " : " + i);try {"".wait(); // 必须是锁对象调用, 并且此方法调用必须处于synchronized块中} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {Runnable runnable = new PrintNumberRunner();Thread thread1 = new Thread(runnable);Thread thread2 = new Thread(runnable);thread1.start();thread2.start();}}package com.atguigu.javase.thread;public class TestDeadLock {// 死锁实例static StringBuffer s1 = new StringBuffer();static StringBuffer s2 = new StringBuffer();public static void main(String[] args) {new Thread() {public void run() {synchronized (s1) {s2.append("A");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s2) {s2.append("B");System.out.print(s1);System.out.print(s2);}}}}.start();new Thread() {public void run() {synchronized (s2) {s2.append("C");synchronized (s1) {s1.append("D");System.out.print(s2);System.out.print(s1);}}}}.start();}
}

java学习之路 之 多线程练习题相关推荐

  1. Java学习之路10——多线程

    一.线程基本概念 1.Process(进程)与Thread(线程) 说起进程,就不得不说下程序.程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念. 而进程则是执行程序的一次执行过 ...

  2. Java学习之路-day23 多线程02

    Java多线程 每日一句 1.线程池 1.1 线程状态介绍 1.2 线程池-基本原理 1.3 线程池-Executors默认线程池 1.4 线程池-Executors创建指定上限的线程池 1.5 线程 ...

  3. java学习之路目录(已完结)

    java学习之路目录(持续更新中-) 第一阶段 javaSE(完结) 序号 标题 内容 001 java初识 java语言特点.体系结构.运行机制 002 java SE基础语法 注释.关键字.变量. ...

  4. java学习之路之javaSE基础1

    <h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解) * A:什么是计算机?计算机在生活中的应 ...

  5. 萌新的java学习之路——第一周

    萌新的java学习之路--第一周 第一周的学习 这是我学习Java的第一周,写这个博客更多的时为了总结自己这一周的学习情况,如果有人看到我写的博客,有什么问题的话,可以问我.虽然我也是一个小白,但我会 ...

  6. java学习之路2--简单工厂模式实现饮料自动贩卖机

    java学习之路2 用简单工厂模式实现饮料自动贩卖机 功能简介 具体实现 1.简单工厂模式 2.代码 总结 用简单工厂模式实现饮料自动贩卖机) 功能简介 接收用户输入的信息,选择购买的饮料. 可供选择 ...

  7. Java学习之路——接口

    Java学习之路--接口 概述 总所周知,我们是父母的孩子.我们的身上既继承了爸爸的基因也继承了妈妈的基因.这就是多继承. 然而在 Java 程序中,是不支持多继承的.Java 仅仅支持单继承.但是接 ...

  8. 我的Java学习之路2009-11-17

    -------------------------------2009年3月19日开始----------------------------- 下载JDK Myeclipse Netbeans JB ...

  9. JAVA学习之路:不走弯路,就是捷径(一)

      0.引言 在ChinaITLAB导师制辅导中,笔者发现问得最多的问题莫过于"如何学习编程?JAVA该如何学习?".类似的问题回答多了,难免会感觉厌烦,就萌生了写下本文的想法.到 ...

最新文章

  1. jconsole工具使用----jvm内存泄漏问题
  2. Windows中利用计划任务实现自动备份文件
  3. 【剑指offer】_02替换空格
  4. MATLAB设置x为0到10所有数,MATLAB教学_10数值微积分
  5. python控制语句字符串截取_菜鸟python---流程控制语句
  6. flex textInput 限制输入
  7. OSPF的多域配置-要点总结
  8. SQLServer导数据到Oracle
  9. SDL2源码分析1:初始化(SDL_Init())
  10. 轻松搞懂均匀分布、高斯分布、瑞利分布、莱斯分布(含MATLAB代码)
  11. maya表情blendshape_引用 【Maya】角色表情绑定-BlendShape的使用技巧
  12. URL重定向(跳转)漏洞
  13. Kali Linux Web 渗透测试秘籍 第七章 高级利用
  14. c语言三位数中有多少素数,输出所以三位数的素数,并求素数的个数,每行输出10个数...
  15. PC端浏览器兼容性问题解决方案
  16. 微信小程序:高德地图在小程序中的实践(含静态地图)
  17. 戴尔服务器能用大白菜装系统吗,戴尔如何用u盘装系统xp
  18. 多路温度采集控制系统(1)项目介绍
  19. keypad driver
  20. Allied World Re任命黄耀铭(Yeo Meng Wong)担任亚太合约再保险部门高级副总裁兼总经理

热门文章

  1. 【Linux】安装yum源
  2. 10个可以边玩游戏边学编程的网站
  3. 360极速浏览器的 chrome://newtab/ 保存方法
  4. mysql数据应用从入门_《MySQL数据库应用从入门到精通》
  5. 深度解读如何在H5中完美融入VR技术
  6. Chrome:拖入crx文件时,显示“无法从该网站添加应用、扩展程序和用户脚本”问题
  7. matlab自动重合闸,电力系统自动重合闸matlab仿真.doc
  8. simulink信号线出现问号的话
  9. 【开箱即用】vk-uniCloud-router - 云函数路由模式 - uniCloud企业级快速开发框架
  10. 北京林业大学经济管理学院与德昂公司校企合作签约