Java--线程之间的通信 线程间数据共享

版权声明:转载请标明本文来源,欢迎点赞评论一起学习ヾ(◍°∇°◍)ノ゙ https://blog.csdn.net/slyslyme/article/details/89053521

在没有使用线程通信时,多线程共同操作同一份数据会造成对同一共享变量的争夺,所以多线程之间的通信可以避免对统一共享变量的争夺。多个线程在处理同一资源并且任务不同时,需要线程通信来帮助解决线程之间对同一变量的操组合使用。

等待唤醒机制(wait()/notify())

wait()

线程在调用wait方法时,会释放它对锁的拥有权,然后等待另外的线程(方式是notify或者notifyall)来通知他,这样重新获得锁的拥有权并且恢复执行。

要确保调用wait方法时,线程拥有该对象的对象级别锁,即wait方法的调用必须放在synchronized方法或者synchronized块中(同步方法或者同步块中),否则抛出IllegalMonitorStateException。

notify()/notifyall()

唤醒一个等待当前对象的锁的线程/唤醒在此对象监视器上等待的所有线程。

当多个线程在等待时,随意选择一个被唤醒,notify()方法应该被拥有对象的锁的线程调用。

代码可参考:https://www.cnblogs.com/Wenxu/p/7979023.html

join()方法

join方法应用举例:很多情况下主线程创建并启用子线程,如果子线程进行大量的耗时运算那么主线程就比子线程结束的早。如果主线程想等子线程运行的结果之后结束,那么就要使用join()方法了。join 的作用是等待线程对象的销毁。

package Java.Thread;

// 线程通信中的join方法
public class join extends Thread{
	public void run() {
		try {
			int secVal = (int)(Math.random()*1000);
			System.out.println(secVal);
			Thread.sleep(secVal);
		} catch(InterruptedException e) {
			e.printStackTrace();
		}
	}
	public static void main(String args[]) throws InterruptedException {
		Thread T1 = new join();
		T1.start();
	    T1.join();
		System.out.println("如果我的前方使用了join()那么我就会最后运性啦~~~");
	}
}

 

线程间数据共享

参考https://www.cnblogs.com/xujishou/p/6640677.html

对于每个线程执行相同的代码时,可以使用同一个Runnable对象

对于每个线程执行不同的代码时,需要使用不同的Runnable对象

猜你喜欢

转载自blog.csdn.net/slyslyme/article/details/89053521