交互线程
交互线程定义:
如果并发执行的多个线程间需要共享资源和交换数据,则这一组线程称为交互线程。
交互线程特点:
交互线程并发执行时相互之间会干扰或影响其他线程的执行结果,因此交互线程之间需要有同步机制(使用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();
}
}
}
}