进程和线程的区别
进程让操作系统并发成为可能
线程让进程内子任务并发成为可能
区别 | 线程 | 进程 |
---|---|---|
独立应用 | 否 | 是 |
独立空间 | 否,只是进程执行的不同路径 | 独立地址空间,相互之间不影响 |
健壮性 | 弱 | 强 |
切换开销 | 小 | 大 |
进程、线程关系
- java对操作系统提供的功能进行封装,包括进程和线程
- 运行一个程序会产生一个进程,进程包含至少一个线程
- 每个进程对应一个jvm实例,多个线程共享jvm里的堆
- java采用单线程编程模式,程序会自动创建主线程
- 主线程可以创建子线程,原则上要后于子线程完成执行
Thread start run
start | run | |
---|---|---|
线程 | 子线程 | 主线程 |
Thread和Runnable关系
如何给run()方法传参
- 构造函数传参
- 成员变量传参
- 回调函数传参
如何实现处理线程的返回值
- 主线程等待法 Thread.sleep
- 使用thread类的join()阻塞当前的线程以等待子线程处理完毕
- 通过callable接口实现,通过future task or 线程池获取
package com.java.thread;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
String value = "test";
System.out.println("Ready to work!");
Thread.sleep(5000);
System.out.println("task done");
return value;
}
}
future task
package com.java.thread;
import java.util.concurrent.FutureTask;
public class FutureTaskDemo {
public static void main(String[] args) {
FutureTask<String> task = new FutureTask<>(new MyCallable());
new Thread(task).start();
if (!task.isDone()) {
System.out.println("please wait");
}
System.out.println("task return " + task.get());
}
}
线程池
package com.java.thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ThreadPoolDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
Future<String> future = newCachedThreadPool.submit(new MyCallable());
if (!future.isDone()) {
System.out.println("please wait");
}
System.out.println("task return " + future.get());
newCachedThreadPool.shutdown();
}
}
线程的状态
- 新建 new:创建后尚未启动
- 运行 runnable:包含running和ready
- 无限等待 waiting:不会被分配cpu执行时间,需要显示被唤醒 【未设置timeout的 Object.wait() 和 Thread.join() 以及LockSupport.park()】
- 限期等待 timed waiting:在一定的时间后会由系统自动唤醒【设置timeout的 Object.wait() 和 Thread.join() 以及LockSupport.parkNanos(),LockSupport.parkUntil(), Thread.sleep()】
- 阻塞 blocked:等待获取排它锁
- 结束 terminated:终止线程状态,已经结束执行
sleep和wait的区别
sleep | wait | |
---|---|---|
方法 | Thread类 | Object类中定义 |
使用 | 任何地方 | synchronized方法或synchronized块中 |
功能 | 只会让出cpu,不会导致锁行为的改变 | 不仅让出cpu,还会释放已经占有的同步锁的资源 |
notify和notifyall
- 锁池 EntryList
- 等待池 WaitSet
yield
对锁的行为不会有影响
如何中断线程
已经被抛弃的方法
- stop
- suspend resume
目前使用的