线程的基本概念
2020-06-09 09:46:01 0 举报
AI智能生成
线程的基本概念
作者其他创作
大纲/内容
什么叫做线程
程序里不同的执行路径就叫做一个线程
创建线程
class MyThread extends Thread
new MyThread()
class MyRunnable implements Runnable
new Thread(new MyRunnable())
MyCall implements Callable
new Thread(new FutureTask<String>(new MyCall()))
new Thread(() -> {
System.out.println("Hello lambda!");
})
System.out.println("Hello lambda!");
})
final ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(() -> {
System.out.println("Hello ThreadPool");
});
executor.shutdown();
executor.execute(() -> {
System.out.println("Hello ThreadPool");
});
executor.shutdown();
线程的方法
sleep()
当前线程暂停一段时间让给别的线程去运行,sleep的线程等睡眠到规定的时间自动复活
yield()
当前线程暂停一段时间让给别的线程去运行,sleep的线程等睡眠到规定的时间自动复活
join()
在自己当前线程加入你调用join的线程,本线程等待,等调用的线程运行完了,自己再去执行
线程状态
Thread t = new MyThread();
new 状态
t.start();
runnable 状态
t.join();
join 执行完后,是 timenated 状态
synchronized
同步方法和非同步方法可以一起调用
只对写方法加锁,对读方法不加锁,会导致脏读,因为synchronized方法与非synchronized方法是同时运行的。解决方案:在get方法也加上synchronized
可重入锁
一个同步方法调用另一个同步方法,有一个方法加了锁,另一个也加了锁,
加的是同一把锁也是同一个线程,那这个时候申请仍然会得到该对象的锁
异常锁
程序在执行过程中,如果出现异常,默认锁会被释放
在并发处理的过程中,有异常要多加小心,不然可能会发生不一致的情况。在第一个线程中抛出异常,其它线程会进入同步代码区,有可能会访问到异常产生时的数据,此要非常小心的处理同步业务逻辑中的异常
锁升级
1.偏向锁
记录这个线程的ID
会在锁对象的头上面 markdown 记录这个线程
2.自旋锁
偏向锁如果有线程争用,就升级为自旋锁
3.重量级锁
会去操作系统申请资源
自旋锁转圈十次后
大于5个线程在自旋
0 条评论
下一页