Java多线程
Java多线程
什么是多线程
就是多个任务同时执行,比如 我可以边吃饭边看电视并且还可以玩手机,就是在同一时间可以同时处理多个事情,这就是多线程
讲多线程前必须先了解线程
和进程
这两者之间的关系
进程
在计算机中,我们把一个任务称为一个进程,比如浏览器,微信 qq 这个都是一个进程
**维基百科:**进程(英语:process),是指计算机中已运行的程序,用户下达运行程序的命令后,就会产生进程。同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一程序,却不会相冲突。
进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程
线程
线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程
维基百科: 线程(英语:thread)是操作系统能够进行运算调度的最小单位
Java中如何创建多线程
在java中有以下方式创建多线程
- 继承
Thread
类重写run
方法 (不建议使用,避免OOP单继承局限性)
// myThread.java
public class MyThread extends Thread{
@Override
public void run() {
super.run();
System.out.println("子线程处理线程数据");
}
}
// 测试方法类 TestApp.java
public class TestApp{
public static void main(String[] args){
MyThread myThread = new MyThread();
// 启动线程
myThread.start();
System.out.println("主线程处理数据");
}
}
- 实现
Runnable
接口(推荐方式,方便同一个对象别多个线程使用)
// RunnableImpl.java
public class RunnableImpl implements Runnable {
@Override
public void run() {
System.out.println("子线程处理数据");
}
}
// 测试方法类 TestApp.java
public class TestApp{
public static void main(String[] args){
RunnableImpl runnableImpl = new RunnableImpl();
// 启动线程
new Thread(runnableImpl).start();
System.out.println("主线程处理数据");
}
}
- 实现
Callable
接口(支持返回值)
// CallableImpl.java
public class CallableImpl implements Callable<String> {
@Override
public String call() {
System.out.println("子线程处理数据");
return "";
}
}
// 测试方法类 TestApp.java
public class TestApp{
public static void main(String[] args){
// 创建执行服务
ExecutorService executorsSer = Executors.newFixedThreadPool(1);
// 提交执行
Future<String> res = executorsSer.submit(new CallableImpl());
// 获取结果
res.get();
// 关闭服务
executorsSer.shutdown();
System.out.println("主线程处理数据");
}
}
线程生命周期
新建状态(New)
当使用new
关键字创建一个线程后,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值,程序不会执行线程的线程执行体
public class Main {
public static void main(String[] args) {
// 创建线程
Thread t = new Thread(() -> {
System.out.println("子线程处理数据");
});
}
}
就绪状态(Runnable)
public class Main {
public static void main(String[] args) {
// 创建线程
Thread t = new Thread(() -> {
System.out.println("子线程处理数据");
});
// 运行
t.start();
}
}
运行状态(Running)
public class Main {
public static void main(String[] args) {
// 创建线程
Thread t = new Thread(() -> {
System.out.println("子线程处理数据");
});
// 运行
t.start();
}
}
阻塞状态(Blocked)
public class Main {
public static void main(String[] args) {
// 创建线程
Thread t = new Thread(() -> {
// 睡眠
Thread.sleep(50);
System.out.println("子线程处理数据");
});
// 运行
t.start();
}
}
死亡状态(Terminated)
线程执行完成就进行死亡状态(Terminated)