Java进阶篇4——线程

本文深入探讨了Java中的线程概念,详细介绍了线程的生命周期、优先级,并讲解了如何通过实现Runnable接口、继承Thread类以及使用Callable和Future创建线程。此外,还讨论了在确保线程执行顺序方面,线程池ExecutorService、计数器CountDownLatch和栅栏CyclicBarrier的应用。
摘要由CSDN通过智能技术生成

1. 什么是线程?

  • 一条线程指的是进程中一个单一顺序的控制流。
  • 一个进程包括由操作系统分配的内存空间。
  • 一个进程中可以并发多个线程。
  • 一个线程不能独立的存在,它必须是进程的一部分。
  • 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

2. 一个线程的生命周期图

在这里插入图片描述

  • 新建状态
1. 使用 new 关键字和 Thread 类或其子类建立一个线程对象。

2. 该线程对象就处于新建状态,它保持这个状态直到程序 start() 这个线程。

3. 新建:创建线程对象。
  • 就绪状态
1. 当线程对象调用了start()方法之后,该线程就进入就绪状态。

2. 就绪状态的线程处于就绪队列中,要等待 JVM里线程调度器的调度。

3. 就绪:线程有执行资格,没有执行权。
  • 运行状态
1. 如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。

2. 处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

3. 有执行资格,有执行权。
  • 阻塞状态
1. 如果一个线程执行了 sleep() (睡眠)、suspend()(挂起)等方法,线程就从运行状态进入阻塞状态。

2.分为三种情况:
- 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
- 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)- 其他阻塞:通过调用线程的 sleep()join() 发出了 I/O 请求时,线程就会进入到阻塞状态。

3. 由于一些操作让线程改变了状态,没有执行资格,没有执行权
另一些操作可以把它给激活,激活处于就绪状态
  • 死亡状态
1. 一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

2. 死亡:线程对象变成垃圾,等待被回收。

3. 线程的优先级

  • Java 线程的优先级是一个整数。
  • 取值:1 ~ 10
  • 线程Thread有一个设置优先级的属性Priority,默认数值为5
  • 设置的越高优先级越高
  • 优先级作用只是表示了执行的概率,也就是说优先级6的线程比5的线程概率更高
  • 在Java中,高优先级的可运行线程会抢占低优先级线程。
  • 如何设置优先级?
例如:
MyThread myThread = new MyThread();
myThread.setPriority(10);

4. 通过实现 Runnable 接口来创建线程

package javaadvanced.thread;

class RunnableDemo implements Runnable {
   
	private Thread thread;
	private String threadName;

	RunnableDemo(String name) {
   
		this.threadName = name;
		System.out.println("Creating " + threadName);
	}

	@Override
	public void run() {
   
		System.out.println("Running " + threadName);

		try {
   
			for (int i = 4; i > 0; i--) {
   
				System.out.println("Thread: " + threadName + ", " + i);
				// 阻塞
				Thread.sleep(50);
			}
		} catch (InterruptedException e) {
   

			/*
			 * 1. 当阻塞方法收到中断请求的时候就会抛出InterruptedException异常
			 * 
			 * 2. 抛InterruptedException的代表方法有:sleep(),wait(),join()
			 */
			System.out.println("Thread " + threadName + " interrupted.");
		}
		System.out.println("Thread " + threadName + " exiting.");
	}

	public void start() {
   
		System.out.println("Starting " + threadName);

		if (thread == null) {
   
			thread = new Thread(this, threadName);
			thread.start();
		}
	}

} // Runnable

public class MyThread {
   

	public static void main(String[] args) {
   
		RunnableDemo thread1 = new RunnableDemo("Thread1");
		thread1.start();

		RunnableDemo thread2 = new RunnableDemo("Thread2");
		thread2.start();
	}

} // MyThread
Creating Thread1
Starting Thread1
Creating Thread2
Starting Thread2
Running Thread1
Thread: Thread1, 4
Running Thread2
Thread: Thread2, 4
Thread: Thread1, 3
Thread: Thread2, 3
Thread: Thread1, 2
Thread: Thread2, 2
Thread: Thread1, 1
Thread: Thread2, 1
Thread Thread1 exiting.
Thread Thread2 exiting.

5. 通过继承Thread来创建线程

/**
 * 通过继承Thread来创建线程
 *
 * @author NoBug
 * @version 1.0
 * @time 2022/3/13
 * @Blog https://blog.csdn.net/qq_51184516
 *
 */
class ThreadDemo extends Thread {
   
	private Thread thread;
	private String threadName;

	ThreadDemo(String name) {
   
		this.threadName = name;
		System.out.println("Creating " + threadName);
	}
	
	@Override
	public void run() {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜满月

鼓励,鼓励,更加努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值