java中线程的一些相关概念,第1篇(主线程、线程优先级、线程组、精灵线程(守护线程)、线程状态、线程同步、死锁、线程间的通信)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/czh500/article/details/88642706

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()进行线程间通信),我放在下一篇文章,希望大家继续关注!

猜你喜欢

转载自blog.csdn.net/czh500/article/details/88642706
今日推荐