Java线程应用
1. 线程有两种创建方法:
There are basically two main ways of having a {@code Thread} execute
application code. One is providing a new class that extends {@code Thread}
and overriding its {@link #run()} method. The other is providing a new
{@code Thread} instance with a {@link Runnable} object during its creation.
In both cases, the {@link #start()} method must be called to actually execute
the new {@code Thread}.
2. 创建方法
<span style="font-size:14px;"> new Thread(){
public void run() {
method();
};
}.start(); </span>
<span style="font-size:14px;">
</span>
<span style="font-size:14px;"></span><pre name="code" class="java"> new Thread(new Runnable() {
@Override
public void run() {
method();
}
}).start();
<span style="font-size:24px;">3. 线程状态</span>
<span style="font-size:18px;"><span style="white-space: pre;"> </span>新建状态(例如new Thread())
<span style="white-space: pre;"> </span>就绪状态(例如start()方法)
<span style="white-space: pre;"> </span>运行状态(例如正在执行run()方法)
<span style="white-space: pre;"> </span>阻塞状态(例如sleep,I/O)
<span style="white-space: pre;"> </span>死亡状态(例如线程的run方法运行结束)</span>
<span style="font-size:18px;">
</span>
<span style="font-size:24px;">4. 线程互斥与协作</span>
<span style="white-space: pre;"><span style="font-size:18px;"> 共享数据集上存在多线程并发操作(此操作非原子操作)的情况下,为了保证数据的安全需要互斥操作;为了让多线程共享数据集上进行通讯以确保业务的合理性需要协作。</span></span>
<span style="white-space: pre;"><span style="font-size:18px;">
</span></span>
<span style="white-space: pre;"><span style="font-size:18px;"><span style="white-space:pre"> </span>4.1 互斥实现方法</span></span>
<span style="white-space: pre;"><span style="font-size:18px;"><span style="white-space:pre"> </span>是对共享数据集加锁,加锁的方式为:</span></span>
</pre><pre name="code" class="java">
<span style="font-size:18px;"><span style="white-space: pre;"> </span>a) 同步代码块</span>
<span style="font-size:18px;"><span style="font-family: Arial, Helvetica, sans-serif;"> <span style="white-space:pre"> </span>synchronized(对象锁) {</span><span style="font-family: Arial, Helvetica, sans-serif;">}<span> </span></span><span style="font-family: Arial, Helvetica, sans-serif;">对象锁在多个线程之间必须是唯一的,不能用线程局部变量做对象锁</span></span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>b) 同步方法(适合大对象,频次较低的场景)</span>
<span style="font-size:18px;"><span style="white-space: pre;"> </span>public synchronized void method01() {} <span style="font-family: Arial, Helvetica, sans-serif;">实例方法对象锁默认为this</span></span>
<span style="white-space:pre"><span style="font-size:18px;"> public static synchronized void method02() {}<span style="white-space:pre"> </span>静态方法对象锁默认为"类名.class"</span></span>
<span style="white-space: pre;"><span style="font-size:18px;">
</span></span>
<span style="white-space: pre;"><span style="font-size:18px;"><span style="white-space:pre"> </span>注意:</span></span>
<span style="white-space: pre;"><span style="font-size:18px;"><span style="white-space:pre"> </span>有一些集合和列表不是线程安全的,在同步并发线程不安全的情况下,需要使用Collections工具类的静态synchronizedXXX方法,将其转换为线程安全的集合和列表。</span></span>
<span style="white-space: pre;"><span style="font-size:18px;"><span style="white-space:pre"> 也可以考虑java.util.concurrent包下的一些集合</span>,有一些ConcurrentXXX的类,可以直接创建线程安全的集合、列表、队列等。</span></span>
<span style="white-space: pre;"><span style="font-size:18px;">
</span></span>
<span style="white-space: pre;"><span style="font-size:18px;"><span style="white-space:pre"> </span>4.2 协作实现方法</span></span>
<span style="font-size:18px;"><span style="white-space: pre;"><span style="white-space:pre"> 线程协作构建与线程互斥基础之上</span>,</span><span style="font-family: Arial, Helvetica, sans-serif;">需要借助Object类的wait,notify,notifyall方法实现</span>。<span style="font-family: Arial, Helvetica, sans-serif;"> </span></span>
<span style="font-size:18px;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> a) wait调用此方法的线程阻塞,同时释放对象锁</span></span></span>
<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>b) </span><span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;">notify/notifyall通知具备相同锁并且处于等待状态的线程开始执行</span>
<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>这些方法必须在同步代码块或同步方法中调用,必须要对象锁调用</span>
</pre><pre name="code" class="java">
4.3 案例
参考生产者、消费者应用模型