java毕向东听课笔记15(线程4)
来源:互联网 发布:ios11不安全网络 编辑:程序博客网 时间:2024/05/21 21:49
JDK1.5中提供了多线程升级解决方案。
将同步Synchronized替换为显示的Lock操作;将Object中的wait,notify,notifyAll替换为Condition对象,该对象可以通过Lock锁进行获取。
实例代码:
import java.util.concurrent.locks.*;public class ProducerConsumerDemo{public static void main(String[] args){Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t1 = new Thread(pro);Thread t2 = new Thread(pro);Thread t3 = new Thread(con);Thread t4 = new Thread(con);t1.start();t2.start();t3.start();t4.start();}}class Resource{private String name;private int count = 1;private boolean flag = false;private Lock lock = new ReentrantLock();//新建锁private Condition condition_pro = lock.newCondition();//condition绑定Lockprivate Condition condition_con = lock.newCondition();//1个lock可以绑定多个conditionpublic void set(String name)throws InterruptedException{lock.lock(); //Lock的lock方法,加锁,替换synchronizedtry{while(flag)condition_pro.await();this.name = name +"--"+count++;System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);flag = true;condition_con.signal();}finally{lock.unlock();//Lock的unlock方法,释放锁}}public void out()throws InterruptedException{lock.lock();try{while(!flag)condition_con.await();System.out.println(Thread.currentThread().getName()+"...消费者......."+this.name);flag = false;condition_pro.signal();}finally{lock.unlock();}}}class Producer implements Runnable{private Resource res;Producer(Resource res){this.res = res;}public void run(){while(true){try{res.set("+商品+");}catch(InterruptedException e){}}}}class Consumer implements Runnable{private Resource res;Consumer(Resource res){this.res = res;}public void run(){while(true){try{res.out();}catch(InterruptedException e){}}}}----------------------------------------------------------------------------------------------------------------
停止线程:
stop()方法已经过时,不允许再被使用。
如何停止线程?只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。所以只要控制循环,就可以让run方法结束,也就是线程结束。
特殊情况:当线程处于了冻结状态,就不会读取到标记,那么线程就不会结束。
例如代码如下:
class StopThread implements Runnable{private boolean flag = true;public synchronized void run(){while(flag){try{wait();}catch(InterruptedException e){System.out.println(Thread.currentThread().getName()+"....Exception");}System.out.println(Thread.currentThread().getName()+"....run");}}public void changeFlag(){flag = false;}}public class StopThreadDemo{public static void main(String[] args){StopThread st = new StopThread();Thread t1 = new Thread(st);Thread t2 = new Thread(st);t1.start();t2.start();int num = 0;while(true){if(num++==60){st.changeFlag();break;}System.out.println(Thread.currentThread().getName()+"........"+num);}}}
结果为:
程序没有结束,必须按ctrl+c强制结束。
interrupt方法是强制清除线程的冻结状态,恢复到运行状态,而不是结束线程。
0 0
- java毕向东听课笔记15(线程4)
- java毕向东听课笔记12(线程1)
- java毕向东听课笔记13(线程2)
- java毕向东听课笔记14(线程3)
- java毕向东听课笔记16(线程5)
- java毕向东听课笔记4(数组排序)
- java毕向东听课笔记2(函数的重载)
- java毕向东听课笔记3(内存划分)
- java毕向东听课笔记7(继承和接口)
- java毕向东听课笔记8(多态)
- java毕向东听课笔记9( 匿名内部类)
- java毕向东听课笔记10(异常)
- java毕向东听课笔记11(异常体系)
- java毕向东听课笔记17(字符串1)
- java毕向东听课笔记18(字符串2)
- java毕向东听课笔记19(字符串3)
- java毕向东听课笔记21(集合框架-共性)
- java毕向东听课笔记26(集合框架-泛型)
- OpenGL: Configuring GLFW and GLEW in Visual C++ Express
- Ubuntu ./make.sh失败
- Oracle学习笔记(二十)——管理权限和角色
- Linux下从信号量看线程调度时间
- Fragment全解析系列
- java毕向东听课笔记15(线程4)
- int 和 Integer 有什么区别
- Win7_64bits下qt5.3.1+opencv2.4.9编译环境的搭建
- 异步任务(AsyncTask)
- 调试神经网络
- java设计模式【策略模式】
- PopupWindow指定位置弹出
- 搭建安卓开发环境
- POI之Excel环境装备和简单介绍