Java线程应用


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 案例

参考生产者、消费者应用模型




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值