进程与线程
执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位
线程是CPU调度和执行的单位
并行与并发
一般将这种线程轮流使用 CPU 的做法称为并发,concurrent(同一时间应对多件事情的能力)
多核CPU下,每个核都可以调度运行线程,这时候线程可以是并行的(同一时间动手做多件事情的能力)
应用
从方法调用的角度,如果
需要等待结果返回,才能继续运行就是同步
不需要等待结果返回,就能继续运行的就是异步
线程创建的三种方式
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(可以有返回值、可以抛出异常、方法不同)
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableTest {
public static void main(String[] args) {
new Thread().start();//怎么启动callable
MyThread thread = new MyThread();
FutureTask futureTask = new FutureTask(thread); //适配类
new Thread(futureTask,"A").start();
new Thread(futureTask,"B").start();//结果会被缓存,效率高
try {
String s = (String) futureTask.get();//callable的返回值,这个get方法可能会产生阻塞,把他放在最后
//或者使用异步通信来处理
System.out.println(s);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("call");//会打印1个call
return "1234";
}
}
线程上下文切换
cpu不再执行当前线程,转而执行另一个线程
sleep和yield
调用sleep会让当前线程从Running进入Timed Waiting状态
调用yield会让当前线程从Running进入Runnable就绪状态,然后调度执行其他线程