黑马程序员_java基础day12
来源:互联网 发布:阿里云代金券申请 编辑:程序博客网 时间:2024/04/29 22:03
------- android培训、java培训、期待与您交流! ----------
主要内容:
一、线程间通信
1,其实就是多个线程在操作同一个资源,但是操作的动作不同。
2,等待唤醒机制
wait:
notify();
notifyAll();
都使用在同步中,因为要对持有监控器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
3,为什么这些操作线程的方法要定义在Object类中呢?
因为这些方法在操作同步中线程时,都必须要标识它们所操作线程持有的锁。
只有同一个锁上的等待线程,可以被同一个锁上的notify唤醒。
不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。
4,生产者消费者示例
例:
/*生产者消费者示例*/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;public synchronized void set(String name){while(flag)try{this.wait();}catch(Exception e){}this.name = name+"--"+count++;System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);flag = true;this.notifyAll();}public synchronized void out(){while(!flag)try{wait();}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"...消费者......."+this.name);flag = false;this.notifyAll();}}class Producer implements Runnable{private Resource res;Producer(Resource res){this.res = res;}public void run(){while (true){res.set("+商品+");}}}class Consumer implements Runnable{private Resource res;Consumer(Resource res){this.res = res;}public void run(){while (true){res.out();}}}
5,停止线程。
stop方法已经过时。
如何停止线程?
只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只有控制住循环,就可以让run方法结束,也就是线程结束。
特殊情况:
当线程处于了冻结状态。
就不会读取到标记,那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。
强制让线程恢复到运行状态来,这样就可以操作标记让线程结束。
Thread类提供该方法 interrupt();
例:
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");flag = false;}System.out.println(Thread.currentThread().getName()+"...run");}}public void changeFlag(){flag = false;}}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){t1.interrupt();t2.interrupt();st.changeFlag();break;}System.out.println(Thread.currentThread().getName()+"......."+num);}}}
6,守护线程setDaemo(boolean on);
将该线程标记为守护线程,当正在运行的线程都是守护线程时,Java虚拟机推出。
该方法必须在启动线程前调用。
t1.setDaemon(true);
t2.setDaemon(true);
t1.start();
t2.start();
7,join()方法(临时加入线程)
当A线程执行到啊了B线程的.join()方法时,A就会等待,等B线程都执行完,A才会执行。
join可以用来临时加入线程执行。
t1.start();
t1.join();
8,线程toString()方法
覆盖了父类中的toString()方法。
返回该线程的字符串表示形式,包括线程名称,优先级和线程组。
9,setPriority(int newPriority)
setPriority()方法是用于设置线程的优先级的 。
优先级共10个级别(1--10)。主线程和其他线程默认的优先级都是5
10,yield()
暂停当前正在执行的线程对象,并执行其他线程。
线程执行了yield()方法后,会暂停正在执行的这个线程对象,执行其他线程。
以达到平均分配的目的。
11,JDK1.5中对于多线程操作的新特性。
JDK1.5中提供了多线程解决方法。
将同步synchronized替换成显示Lock操作。
将Object中的wait,notify notifAll,替换成了Condition对象。
Condition对象中的新方法:await();signal();signalAll();
该对象可以通过Lock锁 进行获取。
解锁语句unlock();一般放在finally语句中执行。
该示例中,实现了本方唤醒对方操作。
例:
import java.util.concurrent.locks.*;class ProducerConsumerDemo2 {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();}}/*JDK1.5中提供了多线程解决方法。将同步synchronized替换成显示Lock操作。将Object中的wait,notify notifAll,替换成了Condition对象。该对象可以通过Lock锁 进行获取。该示例中,实现了本方唤醒对方操作。*/class Resource{private String name;private int count = 1;private boolean flag = false;private Lock lock = new ReentrantLock();private Condition condition_pro = lock.newCondition();private Condition condition_con = lock.newCondition();public void set(String name)throws InterruptedException{lock.lock();try{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();//释放锁的动作一定要执行}}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){}}}}
- 黑马程序员_java基础day12
- 黑马程序员--Java基础Day12
- 黑马程序员_java基础
- 黑马程序员_java基础
- 黑马程序员_java 基础
- 黑马程序员_java基础
- 黑马程序员_Java基础
- 黑马程序员_java基础
- 黑马程序员_java基础
- 黑马程序员_java基础
- 黑马程序员_Java基础
- 黑马程序员_java基础
- 黑马程序员_java基础
- 黑马程序员_java基础
- 黑马程序员_Java基础
- 黑马程序员_java基础
- 黑马程序员_Java基础
- 黑马程序员_java基础
- 【python】asq-queryable(1)
- 黑马程序员 面向对象
- Invalidate()函数
- Java_io_RandomAccessFile类
- 10 个很有用的 WordPress 聊天插件
- 黑马程序员_java基础day12
- HDU1496(hash)
- 自动访问QQ空间(亮点是程序的美化)
- 如何在1到N个人当中找出明星?
- android中AIDL
- 现在的你决定你的未来
- Miracast
- 一位盲人工程师的谷歌之路
- 递归算法详解