java中线程的一些相关概念
先了解一点线程相关的概念:主线程、线程优先级、线程组、精灵线程(守护线程)、线程状态、线程同步、死锁、线程间的通信(使用 wait()notify()notifyAll()进行线程间通信)
精灵线程又称为守护线程
接下来先介绍主线程和线程优先级
/**
* 在java程序启动时,有一个线程立即执行,我们把该线程称为程序的主线程
* 主线程的重要性体现在两方面
* 1.它是产生其他子线程的线程
* 2.通常它必须最后完成执行,因为它执行各种关闭动作
*
*/
下面直接看代码和截图
接下来是主线程和线程优先级案例代码,代码中有注释和说明
周芷若Zhouzhiruo2类
package com.demo.thread;
/**
* 周芷若类
*/
public class Zhouzhiruo2 extends Thread{
//线程体
@Override
public void run() {
pao();
}
public void pao() {
for (int i = 0; i < 5; i++) {
System.out.println("周芷若生气气了,跑啊跑....");
}
}
}
赵敏Zhaomin2类
package com.demo.thread;
/**
* 赵敏类
*/
public class Zhaomin2 extends Thread{
//线程体
@Override
public void run() {
quan();
}
public void quan() {
for (int i = 0; i < 5; i++) {
System.out.println("赵敏劝啊劝!!!!");
}
}
}
张无忌Zhangwuji3类
package com.demo.thread;
/**
* 方式2,实现Runnable接口,这种方式对系统的侵入性更小,而且本
* 类还可以实现其他的接口和继承其他的类,扩展性更好(在java中,是单继承的,但
* 是java中的一个类可以实现多个接口)
* 张无忌类
*/
public class Zhangwuji3 implements Runnable{
//线程体
@Override
public void run() {
zhui();
}
public void zhui() {
for (int i = 0; i < 5; i++) {
System.out.println("张无忌追啊追----");
}
}
}
张无忌Zhangwuji4类
package com.demo.thread;
/**
* 方式2,实现Runnable接口,这种方式对系统的侵入性更小,而且本
* 类还可以实现其他的接口和继承其他的类,扩展性更好(在java中,是单继承的,但
* 是java中的一个类可以实现多个接口)
* 张无忌类
*/
public class Zhangwuji4 implements Runnable{
//线程体
@Override
public void run() {
zhui();
}
public void zhui() {
for (int i = 0; i < 5; i++) {
System.out.println("我是张无忌,我追啊追!!!!!!!!");
}
}
}
运行类,TestMainThread类
运行类中有主线程和线程优先级的注释说明!
package com.demo.thread;
public class TestMainThread {
public static void main(String[] args) {
/**
* 在java程序启动时,有一个线程立即执行,我们把该线程称为程序的主线程
* 主线程的重要性体现在两方面
* 1.它是产生其他子线程的线程
* 2.通常它必须最后完成执行,因为它执行各种关闭动作
*
*/
//当前正在运行的线程对象
//主线程
Thread currentThread = Thread.currentThread();//Thread类的静态方法
System.out.println(currentThread + "当前线程的名称=" +currentThread.getName());
//我们可以给线程设置名称
currentThread.setName("jiangxi");
System.out.println(currentThread + "当前线程的名称=" +currentThread.getName());
//如下这种方式就是多线程的方式(多线程就是我们所说的齐头并进),线程有优先级的概念,线程的优先级默认为5
Zhouzhiruo2 zhouzhiruo2 = new Zhouzhiruo2();
Zhangwuji3 zhangwuji3 = new Zhangwuji3();
Zhaomin2 zhaomin2 = new Zhaomin2();
//构造方法传参
Thread cpu = new Thread(zhangwuji3);//构造器传参
System.out.println("线程名字=" + cpu.getName() + "******");
System.out.println("线程信息=" + cpu.currentThread().getName() + "-----");
System.out.println("线程信息=" + cpu.currentThread() + "######");
// 构造函数传参
// cpu = new Thread(new Zhangwuji4());// 构造器传参
// System.out.println("线程名字=" + cpu.getName() + "******");
// System.out.println("线程信息=" + cpu.currentThread().getName() + "-----");
// System.out.println("线程信息=" + cpu.currentThread() + "######");
/*
* 注意:
* java线程的优先级并不代表一定会执行,只是说明执行的概率高一些,所以在java中用优
* 先级控制执行顺序是不确定的
*/
//设置优先级,优先级设置成10,优先级最高,属于抢占式策略。(而优先级相同的线程,采用时间片式策略)
//要在调用start()方法前设置优先级,优先级越高,就能获得更多的cpu资源
zhaomin2.setPriority(Thread.MAX_PRIORITY);
System.out.println("赵敏的优先级=" + zhaomin2.getPriority());
//线程的优先级默认为5
System.out.println("周芷若的优先级=" + zhouzhiruo2.getPriority());
//调用start()方法启动线程
zhouzhiruo2.start();
cpu.start();
zhaomin2.start();
//垃圾回收车是一个守护线程(守护线程又叫做精灵线程),垃圾回收车线程的优先级最低,为1级
System.gc();//该行代码的意思是,建议垃圾回收车线程去运行,但是到底会不会运行,这是不一定的
String activeCount = "当前线程组里面,正在活动的线程的数目=";
//当前线程组里面,正在活动的线程的数目
//Thread类的静态方法
System.out.println(activeCount + Thread.activeCount());
}
}
运行结果如下:大家要明白,每次运行的结果都是不一样的!
接下来是线程组的案例
运行类,TestThreadGroup类
package com.demo.thread;
public class TestThreadGroup {
public static void main(String[] args) {
//创建一个线程组,它默认隶属于系统线程组
ThreadGroup jerryThreadGroup = new ThreadGroup("jerryThreadGroup");
System.out.println("####################线程组名字=" + jerryThreadGroup.getName());
System.out.println("###########当前线程组的父线程组名字=" + jerryThreadGroup.getParent().getName());
Zhouzhiruo2 zhouzhiruo2 = new Zhouzhiruo2();
Zhangwuji3 zhangwuji3 = new Zhangwuji3();
Zhaomin2 zhaomin2 = new Zhaomin2();
//构造方法传参
Thread cpu = new Thread(jerryThreadGroup, zhangwuji3);//构造器传参
//调用start()方法启动线程
zhouzhiruo2.start();
cpu.start();
zhaomin2.start();
String activeCount = " 当前线程组里面,正在活动的线程和线程组的数目=";
//当前线程组里面,正在活动的线程的数目
System.out.println("线程组名字=" + jerryThreadGroup.getName() + activeCount + jerryThreadGroup.activeCount());
//通过getThreadGroup()函数得到当前线程隶属的线程组
ThreadGroup threadGroup = zhouzhiruo2.getThreadGroup();
//线程组的activeCount()函数得到当前线程组中活动的线程和线程组数目
System.out.println("线程组名字=" + threadGroup.getName() + activeCount + threadGroup.activeCount());
}
}
运行结果如下:
接下来是守护线程(精灵线程)的案例,守护线程又叫做精灵线程
周芷若和张无忌和赵敏,他们肯定也会口渴,肯定是要喝水的,我这里写了一个供水线程
供水线程,WaterSupplyThread类
package com.demo.thread;
//这是一个供水线程(是一个精灵线程,精灵线程又叫做守护线程)
public class WaterSupplyThread extends Thread {
@Override
public void run() {
int i = 0;
while (true) {
System.out.println("我是一个供水的守护线程" + i++);
}
}
}
如下是运行类,TestDaemonThread类
我们可以把守护线程以外的线程,都可以叫做是用户线程
把供水线程设置为守护线程(只要没有用户线程在运行了,那守护线程就会停止,也不会再继续运行了)
package com.demo.thread;
// 测试守护线程(守护线程又叫精灵线程)
public class TestDaemonThread {
public static void main(String[] args) {
Zhouzhiruo2 zhouzhiruo2 = new Zhouzhiruo2();
Zhangwuji3 zhangwuji3 = new Zhangwuji3();
Zhaomin2 zhaomin2 = new Zhaomin2();
// 构造方法传参
Thread cpu = new Thread(zhangwuji3);
WaterSupplyThread waterSupplyThread = new WaterSupplyThread();
//垃圾回收车是一个守护线程(守护线程又叫做精灵线程),垃圾回收车线程的优先级最低,为1级
//把供水线程设置为守护线程(只要没有用户线程在运行了,那守护线程就会停止,也不会再继续运行了)
waterSupplyThread.setDaemon(true);
waterSupplyThread.start();
zhouzhiruo2.start();
cpu.start();
zhaomin2.start();
}
}
运行结果如下:
只要没有用户线程在运行了,那守护线程就会停止,也不会再继续运行了
接下来是守护线程(精灵线程)的第2个案例
这是一个普通的用户线程,UsualThread类(ps:我们可以把守护线程以外的线程,都可以叫做是用户线程)
package com.demo.thread;
//这是一个普通的用户线程
public class UsualThread extends Thread {
@Override
public void run() {
int a = 0;
while (true) {
System.out.println("我是一个普通的用户线程" + a++);
}
}
}
运行类,TestDaemonThread2类
package com.demo.thread;
// 测试守护线程(守护线程又叫精灵线程)
public class TestDaemonThread2 {
public static void main(String[] args) {
Zhouzhiruo2 zhouzhiruo2 = new Zhouzhiruo2();
Zhangwuji3 zhangwuji3 = new Zhangwuji3();
Zhaomin2 zhaomin2 = new Zhaomin2();
UsualThread usualThread = new UsualThread();
// 构造方法传参
Thread cpu = new Thread(zhangwuji3);
WaterSupplyThread waterSupplyThread = new WaterSupplyThread();
//垃圾回收车是一个守护线程(守护线程又叫做精灵线程),垃圾回收车线程的优先级最低,为1级
//把供水线程设置为守护线程(只要还有用户线程在运行,那守护线程就不会停止,也在继续运行)
waterSupplyThread.setDaemon(true);
waterSupplyThread.start();
zhouzhiruo2.start();
cpu.start();
zhaomin2.start();
usualThread.start();
}
}
运行结果如下:
剩下的内容,线程状态、线程同步、死锁、线程间的通信(使用 wait()notify()notifyAll()进行线程间通信),我放在下一篇文章,希望大家继续关注!