Java基础加强 交互线程

本文介绍了在多线程环境中如何通过同步机制实现线程间的协作,包括使用Synchronized关键字和Lock接口下的Condition条件对象两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                             交互线程

交互线程定义:

     如果并发执行的多个线程间需要共享资源和交换数据,则这一组线程称为交互线程。

交互线程特点:

     交互线程并发执行时相互之间会干扰或影响其他线程的执行结果,因此交互线程之间需要有同步机制(使用Synchronized关键字,读写锁Lock它有如下特点:多个读锁不互斥读锁与写锁互斥写锁与写锁互斥)。

交互线程之间的关系:竞争和协作关系。

对于竞争关系的交互线程间需要采用线程互斥方式解决共享资源冲突问题。

对于协作关系的交互线程间需要采用线程同步方式解决线程间通信及因执行速度不同而引起的不同步问题!

关于竞争和协作关系的代码如下:

使用Synchronized关键字实现交互线程间协作关系代码:

package Cn.itcast;

 

public class TraditionThreadConnectionTest {

 

/**

 * @param args

 */

public static void main(String[] args) {

// TODO 自动生成的方法存根

TraditionThreadConnectionTest ttc=new TraditionThreadConnectionTest();

final connection con=ttc.new connection();

new Thread(new Runnable() {

@Override

public void run() {

// TODO 自动生成的方法存根

for(int i=1;i<=10;i++){

con.sub(i);

}

}

}).start();

for(int i=1;i<=10;i++){

con.main(i);

}

 

}

class connection{

private boolean connectionsingle=true;

public  void sub(int i){

synchronized (this){

while(!connectionsingle){

try {

this.wait();

catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

for(int j=1;j<=5;j++){

System.out.println("sub 执行第"+j+"次"+i);

}

connectionsingle=false;

this.notify();

}

}

public synchronized void main(int i){

while(connectionsingle){

try {

this.wait();

catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

for(int j=1;j<=10;j++){

System.out.println("main 执行第"+j+"次"+i);

}

connectionsingle=true;

this.notify();

}

}

 

}

 

使用锁实现线程间协作通信代码:

package Cn.itcast;

 

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

 

public class ConditinTest {

 

/**

 * @param args

 */

public static void main(String[] args) {

// TODO 自动生成的方法存根

ConditinTest ct =new ConditinTest();

final ABC abc=ct.new ABC();

new Thread(new Runnable(){

public void run(){

for(int i=1;i<=10;i++){

abc.A(i);

}

}

}).start();

new Thread(new Runnable(){

public void run(){

for(int i=1;i<=10;i++){

abc.B(i);

}

}

}).start();

new Thread(new Runnable(){

public void run(){

for(int i=1;i<=10;i++){

abc.C(i);

}

}

}).start();

 

}

class ABC{

private Lock lock=new ReentrantLock();

private Condition concurrent1=lock.newCondition();

private Condition concurrent2=lock.newCondition();

private Condition concurrent3=lock.newCondition();

private int key=1;

public void A(int i){

lock.lock();

try{

if(key!=1){

try {

concurrent1.await();

} catch (InterruptedException e) {

// TODO 自动生成的 catch 

e.printStackTrace();

}

}

for(int j=1;j<=5;j++){

System.out.println("老大的JJJ值为:"+j+"III值为:"+i);

}

key=2;

concurrent2.signal();

}finally{

lock.unlock();

}

}

public void B(int i){

lock.lock();

try{

if(key!=2){

try {

concurrent2.await();

} catch (InterruptedException e) {

// TODO 自动生成的 catch 

e.printStackTrace();

}

}

for(int j=1;j<=10;j++){

System.out.println("老二的JJJ值为:"+j+"III值为:"+i);

}

key=3;

concurrent3.signal();

}finally{

lock.unlock();

}

}

public void C(int i){

lock.lock();

try{

if(key!=3){

try {

concurrent3.await();

} catch (InterruptedException e) {

// TODO 自动生成的 catch 

e.printStackTrace();

}

}

for(int j=1;j<=15;j++){

System.out.println("老三的JJJ值为:"+j+"III值为:"+i);

}

key=1;

concurrent1.signal();

}finally{

lock.unlock();

}

}

}

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值