栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程通讯

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程通讯

多线程编程步骤

第一步 创建资源类,在资源类中创建属性和操作方法

第二步 在资源类中操作方法

(1)判断  一般用while

  (2) 干活

  (3) 通知

第三步 创建多个线程,调用资源类的操作方法

1.线程通讯

两个线程,一个线程执行+1  另一个线程执行-1 

使用synchronized

public class DataOperate {
	
	private int number=0;
	
	public synchronized void  increase() throws InterruptedException {
		
		while(number!=0) {
			this.wait();//wait在哪里睡就在哪里醒
		}
		number++;
		System.out.println(Thread.currentThread().getName()+"t"+number);		
		this.notifyAll();
	}
	
	public synchronized void  decrease() throws InterruptedException {
		
		while(number!=1) {
			this.wait();
		}
		number--;
		System.out.println(Thread.currentThread().getName()+"t"+number);
		this.notifyAll();
	}

}

使用Lock

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class DateOperateLock {
	private int num=0;
	private ReentrantLock lock=new ReentrantLock();
	private Condition condition=lock.newCondition();

	public void incr() throws InterruptedException {
		lock.lock();
		try {
			while(num!=0) {
				condition.await();
			}
			num++;
			System.out.println(Thread.currentThread().getName()+"t"+num);
			condition.signalAll();
		}
		finally{
			lock.unlock();
		}
	}
	
	public void decr() throws InterruptedException {
		lock.lock();
		try {
			while(num!=1) {
				condition.await();
			}
			num--;
			System.out.println(Thread.currentThread().getName()+"t"+num);
			condition.signalAll();
		}
		finally{
			lock.unlock();
		}
	}
}

2.线程定制化通讯

三个线程交替顺序打印内容

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

class ShareResource{
	private int flag=1;//aa 1   bb 2  cc 3
	private ReentrantLock lock=new ReentrantLock();
	private Condition conditionA=lock.newCondition();
	private Condition conditionB=lock.newCondition();
	private Condition conditionC=lock.newCondition();
	
	public void print5(int loop) throws InterruptedException {
		try {
			lock.lock();
			while(flag!=1) {
				conditionA.await();
			}
			for(int i=0;i<5;i++) {
				System.out.println(Thread.currentThread().getName()+" t"+i+" t"+loop);
			}
			flag=2;
			conditionB.signal();
			
		}finally {
			lock.unlock();
		}
	}
	
	public void print10(int loop) throws InterruptedException {
		
		try {
			lock.lock();
			while(flag!=2) {
				conditionB.await();
			}
			for(int i=0;i<10;i++) {
				System.out.println(Thread.currentThread().getName()+" t"+i+" t"+loop);
			}
			flag=3;
			conditionC.signal();
			
		}finally {
			lock.unlock();
		}
	}
	
	public void print15(int loop) throws InterruptedException {
		
		try {
			lock.lock();
			while(flag!=3) {
				conditionC.await();
			}
			for(int i=0;i<15;i++) {
				System.out.println(Thread.currentThread().getName()+" t"+i+" t"+loop);
			}
			flag=1;
			conditionA.signal();
			
		}finally {
			lock.unlock();
		}
	}
}

public class ThreadCustomOper {

	public static void main(String[] args) {
		ShareResource sr=new ShareResource();
		new Thread(()->{
			for(int i=0;i<10;i++) {
				try {
					sr.print5(i);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		},"AA").start(); 
		
		new Thread(()->{
			for(int i=0;i<10;i++) {
				try {
					sr.print10(i);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		},"BB").start(); 
		
		new Thread(()->{
			for(int i=0;i<10;i++) {
				try {
					sr.print15(i);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		},"CC").start(); 
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/572689.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号