有了多线程,可以让程序同时做多件事情
并发:多个指令在单个CPU上交替执行
并行:多个指令在多个CPU上同时执行
Thread
类的方式Thread
Main类
public class Main {
public static void main(String[] args) {
Test test1=new Test();
Test test2=new Test();
test1.start();
test2.start();
}
}
线程类
public class Test extends Thread{
static int n=10;
@Override
public void run() {
for (; n >= 0; n--) {
System.out.println(n);
}
}
}
Runnable
接口的方式Runnable
接口run
方法Thread
类对象,传入自定义类Main类
public class Main {
public static void main(String[] args) {
Test test=new Test();
Thread thread1=new Thread(test);
Thread thread2=new Thread(test);
thread1.start();
thread2.start();
}
}
自定义类
public class Test implements Runnable{
static int n=10;
@Override
public void run() {
for (; n >= 0; n--) {
System.out.println(n);
}
}
}
Callable
接口call
(有返回值的,表示多线程的运行结果。前面两种方法的run方法的放回值都是void)FutureTask
的对象(管理多线程运行的结果)FutureTask
的对象Main类
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Test test=new Test();
FutureTask<Boolean> futureTask=new FutureTask<>(test);
Thread t1=new Thread(futureTask);
t1.start();
boolean result=futureTask.get();
System.out.println(result);
}
}
线程类
import java.util.concurrent.Callable;
public class Test implements Callable<Boolean> {
static int n = 10;
@Override
public Boolean call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
return true;
}
}
Callable的泛型类型就是返回值类型
Thread
类的方式:
run
方法,可以直接覆盖Thread
类的run
**方法。Thread
**类,就不能再继承其他类。Runnable
接口的方式:
run
**方法,可以实现其他接口和继承其他类。Runnable
**实例。FutureTask
**可以获取线程执行结果。Callable
接口和处理FutureTask
**。Runnable
**方式类似,可以共享资源。Thread
类方法String getName() 返回此线程的名称
void setName() 设置此线程的名称(也可以使用构造方法)
static Thread currentThread() 获取当前线程的对象
static void sleep(long time) 让线程休眠指定的时间,单位为毫秒
setPriority(int newPriority) 设置线程优先级
final int getPriority() 获取线程优先级
final void setDaemon(boolean on) 设置为守护线程
public static void yield() 出让/礼让线程
public static void join() 插入线程/插队线程
Thread
的方法sleep
方法
setPriority
方法
setDaemon
守护线程方法
sleep()
获取醒来后是要去重新获取CPU的执行权的,但是获取到了执行权,他不是从run
方法从头开始执行,而是从刚刚的sleep
代码下面开始执行
synchronized
锁直接像if
方法一样用synchronized
把代码括起来
synchronized(锁对象){...}
什么东西都可以当锁对象,但是一定要是唯一的
格式:修饰符 synchronized
返回值类型 方法名(方法参数)
lock
锁static Lock *lock*=new ReentrantLock();
lock.lock()
lock.unlock()
指路
多线程必考的「生产者 - 消费者」模型,看齐姐这篇文章就够了-阿里云开发者社区
Executors
:线程池的工具类通过调用方法返回不同类型的线程池对象