Java多线程Thread类了解和使用
创建线程的两种方式
- extends Thread 类
public class WelComeApp {public static void main(String[] args) {
WelcomeThread thread = new WelcomeThread();
thread.start();
System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName());
}public static class WelcomeThread extends Thread {
@Override
public void run() {
System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName());
}
}
}
- 实现 Runnable 接口
public class WelComeApp1 {public static void main(String[] args) {Thread thread = new Thread(() -> System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName()));
thread.start();
System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName());
}
}
注意事项
- 一个
Thread
实例调用过start
方法后,就不能再次调用,否则会出现java.lang.IllegalThreadStateException
异常信息
位于
Thread#State
枚举列表出6个状态public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
- NEW
刚刚创建好的线程对象,在Start
方法之前
- RUNNABLE
在它的内部有两个子状态、ready,running
。线程一定是在被cpu调度到了,再一切准备完毕下才能开始工作。
那么READY
就是获取到CPU资源,准备就绪,可以执行。
RUNNING
表示正在程序正在执行,对应到是java
代码里的run
方法。
- BLOCKED
阻塞的, 通常我们说这个形容词都是在文件系统才用的到,这里也可以这么的认为,当前线程被一个I/O操作给阻塞住了,当前所占的cpu资源被分配去做其他事情了!等阻塞完后,再申请CPU资源回到RUNABLE
状态。
- WAITING
产生这些状态一搬在当前线程调用了Object.wait()
、Thread.join()
调用Object.notify()/Object.notifyAll()
回到RUNABLE
- TIMED_WAITING
- TERMINATED
这没啥好说的,当前线程结束。
- 大大的提高了系统的吞吐率
- 能充分的利用多核处理器资源
- 使用多线程比使用多进程更能节省资源
- 线程安全的问题,同一个进程内的线程是共享进程资源,没有做好安全控制可能会导致数据混乱。
- 提高了编程难度,比如产生死锁,导致程序奔溃
- 可能会加重CPU负担,多个线程工作会导致上下文的切换,这也是一笔不小的开支。
【Java多线程Thread类了解和使用】参考
- 《Java多线程编程实战指南》第1章
推荐阅读
- java实现输出任意整数的每一位
- SpringBoot整合MQTT并实现异步线程调用的问题
- 基于Java利用static实现单例模式
- 一篇文章弄懂Java8中的时间处理
- C+继承之同名覆盖|C+继承之同名覆盖,函数重写与多态详解
- Java中常用的设计模式之责任链模式详解
- Java中常用的设计模式之装饰器模式详解
- Java中常用的设计模式之观察者模式详解
- Java中常用的设计模式之策略模式详解
- Java中常用的设计模式之模板模式详解