目录
认识线程
概念
什么是线程?
为啥要有线程
进程和线程的区别
Java 的线程 和 操作系统线程 的关系
创建线程
1.继承 Thread 类
2.实现 Runnable 接口
3.通过匿名内部类方式创建Thread与实现Runnable
4.Lmabda表达式
Thread 类及常见方法
Thread 的常见构造方法
Thread 的几个常见属性
启动一个线程-start()
中断一个线程
等待一个线程-join()
获取当前线程引用
休眠当前线程
线程的状态
观察线程的所有状态
认识线程
概念
什么是线程?
一个线程就是一个 " 执行流 ". 每个线程之间都可以按照顺讯执行自己的代码 . 多个线程之间 " 同时 " 执行着多份代码。
为了解决资源消耗问题,提出一个轻量化进程的概念(线程),创建线程时只关注要处理的任务,使用的是进程创建时申请的所有资源(类比开工厂)。
为啥要有线程
- 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU资源.
- 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程.
- 创建线程比创建进程更快.
- 销毁线程比销毁进程更快.
- 调度线程比调度进程更快.
进程和线程的区别
- 进程是包含线程的. 每个进程至少有一个线程存在,即主线程。
- 进程和进程之间不共享内存空间. 同一个进程的线程之间共享同一个内存空间.
- 进程是系统分配资源的最小单位,线程是系统调度的最小单位。
Java 的线程 和 操作系统线程 的关系
创建线程
1.继承 Thread 类
public class MThread {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
class MyThread extends Thread{
@Override
public void run() {
System.out.println("这是线程运行代码");
}
}
2.实现 Runnable 接口
public class MRunnable {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("这是线程运行代码");
}
}
使用Runnable定义的好处:
- 解耦,把定义线程与定义任务分开,以便修改代码统一修改
- 继承 Thread 类, 直接使用 this 就表示当前线程对象的引用.
- 实现 Runnable 接口, this 表示的是 MyRunnable 的引用. 需要使用 Thread.currentThread()
3.通过匿名内部类方式创建Thread与实现Runnable
Thread
public class Thread_Anon {
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run() {
System.out.println("这是线程运行代码");
}
};
thread.start();
}
}
Runnable
public class Runnable_Anon {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("这是线程执行代码");
}
});
thread.start();
}
}
4.Lmabda表达式
public class lambda {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("这是线程执行代码");
});
thread.start();
}
}
用Lambda表达式实现的接口必须是函数式接口(接口中只有一个没有实现的方法)
使用多线程编程主要是为了充分利用CPU资源,提升程序运行效率;
但并不是所有场景使用多线程都可以提高效率
Thread 类及常见方法
Thread 的常见构造方法
Thread 的几个常见属性
属性
|
获取方法 |
ID | getId() |
名称 | getName() |
状态 | getState() |
优先级 | getPriority() |
是否后台线程 | isDaemon() |
是否存活 | isAlive() |
是否被中断 | isInterrupted() |
- ID 是线程的唯一标识,不同线程不会重复
- 名称是各种调试工具用到
- 状态表示线程当前所处的一个情况
- 优先级高的线程理论上来说更容易被调度到
- 关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。
- 是否存活,即简单的理解,为 run 方法是否运行结束了
- 线程的中断问题
启动一个线程-start()
中断一个线程
- 通过共享的标记来进行沟通
- 调用 interrupt() 方法来通知
public class ThreadDemo {
private static class MyRunnable implements Runnable {
@Override
public void run() {
// 两种方法均可以
while (!Thread.interrupted()) {
//while (!Thread.currentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName()
+ ": 别管我,我忙着转账呢!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName()
+ ": 有内鬼,终止交易!");
// 注意此处的 break
break;
}
}
System.out.println(Thread.currentThread().getName()
+ ": 啊!险些误了大事");
}
}
public static void main(String[] args) throws InterruptedException {
MyRunnable target = new MyRunnable();
Thread thread = new Thread(target, "李四");
System.out.println(Thread.currentThread().getName()
+ ": 让李四开始转账。");
thread.start();
Thread.sleep(10 * 1000);
System.out.println(Thread.currentThread().getName()
+ ": 老板来电话了,得赶紧通知李四对方是个骗子!");
thread.interrupt();
}
}
thread 收到通知的方式有两种:
-
当出现 InterruptedException 的时候 , 要不要结束线程取决于 catch 中代码的写法 . 可以选择忽略这个异常 , 也可以跳出循环结束线程 .
- Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志
- Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志
等待一个线程-join()
获取当前线程引用
方法
|
说明
|
public static Thread currentThread();
|
返回当前线程对象的引用
|
休眠当前线程
方法
|
说明
|
public static void sleep(long millis) throws InterruptedException
|
休眠当前线程
millis
毫秒
|
public static void sleep(long millis, int nanos) throws
InterruptedException
|
可以更高精度的休眠
|
线程的状态
观察线程的所有状态
public class ThreadState {
public static void main(String[] args) {
for (Thread.State state : Thread.State.values()) {
System.out.println(state);
}
}
}
- NEW: 安排了工作, 还未开始行动
- RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
- BLOCKED: 这几个都表示排队等着其他事情
- WAITING: 这几个都表示排队等着其他事情
- TIMED_WAITING: 这几个都表示排队等着其他事情
- TERMINATED: 工作完成了.
文章来源:https://www.toymoban.com/news/detail-436721.html
这里只是线程的部分知识,剩下的知识总结我会后面继续发布,期待大家关注文章来源地址https://www.toymoban.com/news/detail-436721.html
到了这里,关于【多线程】初识线程,基础了解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!