JAVA高级之线程通信

线程通信

一.线程实现交替打印
①利用wait() notify():

package com.cn.java3;

import java.util.concurrent.locks.ReentrantLock;

/**
 * Description: 
线程的打印,线程1,2交替打印 * date:
* @author: your name
* @since JDK 1.8 * * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。 * notify():一旦执行此方法,就会唤醒被wait的一个线程,如果多个线程,就唤醒优先级高的那个(即先被阻塞的那个) * notifyAll():一旦执行此方法,就会唤醒被wait的所有线程 * * 说明: * 1.wait() notify() notifyAll() 必须使用在同步代码块或同步方法中 * 2.wait() notify() notifyAll()三个方法的调用者必须是同步代码块或同步方法中的同步监视器 * 否者会出现异常 * */
class Number1 implements Runnable{ private int number = 1; @Override public void run() { while(true) { synchronized (this) { //释放最先阻塞的那个线程 this.notify(); if (number <= 50) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + number); number++; try { //调用wait使得线程发生阻塞 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } public class NewMethod { public static void main(String[] args) { Number1 n = new Number1(); Thread t1 = new Thread(n); Thread t2 = new Thread(n); t1.start(); t2.start(); t1.setName("机器1:"); t2.setName("机器2:"); } }

②利用lock锁

package com.cn.java3;

import java.util.concurrent.locks.ReentrantLock;

/**
* Description: 
线程的打印,线程1,2交替打印 * date:
* @author: your name
* @since JDK 1.8 */
class Number implements Runnable{ private int number = 1; private ReentrantLock lock = new ReentrantLock(true); @Override public void run() { while(true) { try { lock.lock(); if (number < 50) { System.out.println(Thread.currentThread().getName() + ":" + number); number++; } }finally { lock.unlock(); } } } } public class CommunicationTest { public static void main(String[] args) { Number n = new Number(); Thread t1 = new Thread(n); Thread t2 = new Thread(n); t1.start(); t2.start(); t1.setName("机器1:"); t2.setName("机器2:"); } }

二、sleep()和wait()的异同?
1.相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态
2.不同点:①两个方法声明在不同的位置:Thread类中声明sleep(),Object类中声明wait()
②调用的要求不同,sleep()可以在任何需要的场景下调用,wait()必须使用在同步代码块或同步方法中。
③关于是否释放同步监视器,如果两个方法都使用在同步代码块和同步方法中,sleep()不会释放锁,wait()会释放锁。

就到这里啦,谢谢大家❥(^_-)

你可能感兴趣的:(java高级编程,java)