微信公众号:Java患者
专注Java领域技术分享
两个线程间的通信
什么时候需要通信
多个线程并发执行时,在默认情况下CPU是随机切换线程的
如果我们希望他们有规律的执行.就可以使用通信,例如每个线程执行一次打印
怎么通信
如果希望线程等待,就调用wait()
如果希望唤醒等待的线程,就调用notify()
这两个方法必须在同步代码中执行,并且使用同步锁对象来调用
三个或者三个以上间的线程通信
notify()是随机唤醒一个线程
notifyAll()方法是唤醒所有线程
jdk5之前无法唤醒指定的一个线程
如果多个线程之间通信,需要使用notifyAll()通知所有线程,用while来反复判断条件
同步
使用ReentrantLock类的lock()和unlock方法进行同步
通信
使用ReentrantLock类的newCondition()方法可以获取Condition对象
需要等待的时候使用Condition的await()方法,唤醒的时候用signal()方法
不同的线程使用不同的Condition,这样就能区分唤醒的时候找哪个线程了
线程组
概述
MyRunnable mr = new MyRunnable(); Thread t1 = new Thread(mr, "张三"); Thread t2 = new Thread(mr, "李四"); //获取线程组 // 线程类里面的方法:public final ThreadGroup getThreadGroup() ThreadGroup tg1 = t1.getThreadGroup(); ThreadGroup tg2 = t2.getThreadGroup(); // 线程组里面的方法:public final String getName() String name1 = tg1.getName(); String name2 = tg2.getName(); System.out.println(name1); System.out.println(name2); // 通过结果我们知道了:线程默认情况下属于main线程组 // 通过下面的测试,你应该能够看到,默任情况下,所有的线程都属于同一个组 System.out.println(Thread.currentThread().getThreadGroup().getName());
// ThreadGroup(String name) ThreadGroup tg = new ThreadGroup("这是一个新的组"); MyRunnable mr = new MyRunnable(); // Thread(ThreadGroup group, Runnable target, String name) Thread t1 = new Thread(tg, mr, "张三"); Thread t2 = new Thread(tg, mr, "李四"); System.out.println(t1.getThreadGroup().getName()); System.out.println(t2.getThreadGroup().getName()); //通过组名称设置后台线程,表示该组的线程都是后台线程 tg.setDaemon(true);
自己设定线程组
线程组的使用,默认是主线程组
ThreadGroup(String name) 创建线程组对象并给其赋值名字
创建线程对象
Thread(ThreadGroup group, Runnable target, String name)
设置整组的优先级或者守护线程
public final ThreadGroup getThreadGroup() 通过线程对象获取他所属于的组
public final String getName() 通过线程组对象获取他组的名字
Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,java允许程序直接对线程组进行控制
默认情况下,所有的线程都属于主线程组
我们也可以给线程设置分组
演示
资料 · 福利
回复 【Java】即可获取最新零基础Java视频资料
回复 【激活】即可获取IDEA、datagrip等系统激活方式
回复 【面试题】即可获取Java技术相关面试题
往期 · 精彩
专注分享Java技术,跟我一起学习吧
长按识别二维码关注