一、进程和线程的概念
进程:通俗讲一个程序的一次执行
线程:可以理解为轻量进程,出于并发要求,出现线程单独执行子任务。
二、多线程的类和接口
1、继承thread类
线程只能启动一次
public class Demo {
public static class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread");
}
}
public static void main(String[] args) {
Thread myThread = new MyThread();
myThread.start();
}
}
2.实现Runnable接口
new Thread(()->{
System.out.println("Java 8 匿名内部类");
}).start();
Callable接口
```java
class Task implements Callable<Integer>{
@Override
public Integer call() throws Exception {
// 模拟计算需要一秒
Thread.sleep(1000);
return 2;
}
public static void main(String args[]) throws Exception {
// 使用
ExecutorService executor = Executors.newCachedThreadPool();
Task task = new Task();
Future<Integer> result = executor.submit(task);
// 注意调用get方法会阻塞当前线程,直到得到结果。
// 所以实际编码中建议使用可以设置超时时间的重载get方法。
System.out.println(result.get());
}
}
Future
class Task implements Callable<Integer>{
@Override
public Integer call() throws Exception {
// 模拟计算需要一秒
Thread.sleep(1000);
return 2;
}
public static void main(String args[]) throws Exception {
// 使用
ExecutorService executor = Executors.newCachedThreadPool();
FutureTask<Integer> futureTask = new FutureTask<>(new Task());
executor.submit(futureTask);
System.out.println(futureTask.get());
}
}
线程
每个线程都属于一个线程组,线程优先级1-10,默认为5,可使用setPriority()设置。ava提供一个线程调度器来监视和控制处于RUNNABLE状态的线程。线程的调度策略采用抢占式
线程状态转换
操作系统中:创建,就绪,运行中,阻塞,结束
java的进程状态:
1.new 创建了线程还没执行start方法,start方法只能调用一次,在start()内部,这里有一个threadStatus的变量。如果它不等于0,调用start()是会直接抛出异常的。
2.runnable
3.blocked
4.waiting 使用wait join locksupport.part()
5.timed_waiting 超时等待状态
Thread.sleep(long millis):使当前线程睡眠指定时间;
Object.wait(long timeout):线程休眠指定时间,等待期间可以通过notify()/notifyAll()唤醒;
Thread.join(long millis):等待当前线程最多执行millis毫秒,如果millis为0,则会一直执行;
LockSupport.parkNanos(long nanos): 除非获得调用许可,否则禁用当前线程进行线程调度指定时间;
LockSupport.parkUntil(long deadline):同上,也是禁止线程进行调度指定时间;
6.TERMINATED
线程中断:
Thread.interrupt():中断线程。这里的中断线程并不会立即停止线程,而是设置线程的中断状态为true(默认是flase);当线程处于wait,sleep,join时,想提前中断线程状态的时候使用interrupt()。会抛出异常进入catch模块。
Thread.currentThread().isInterrupted():测试当前线程是否被中断。线程的中断状态受这个方法的影响,意思是调用一次使线程中断状态设置为true,连续调用两次会使得这个线程的中断状态重新转为false;
Thread.isInterrupted():测试当前线程是否被中断。与上面方法不同的是调用这个方法并不会影响线程的中断状态。
线程通信
1.锁 lock synchronized
2.等待通知机制 wait notify 信号量 管道 join方法