今天做了一个Demo,主要功能是:主线程执行10次,然后子线程执行10次,再然后主线程执行10次,如此循环50次。
设计思路:
1、先实现两个线程的互斥。
这里会用到锁来同步代码的执行。初步设计是在两个线程中都使用一把锁来控制业务代码的执行。
public class test1 {
public static void main(String[] args){
new Thread(new Runnable(){
@Override
public void run() {
synchronized(test1.class){
for(int i=1;i<=50;i++){
for(int j=0;j<=10;j++){
System.out.println("sub thread sequece of "+j+", loop of"+i);
}
}
}
}
}).start();
synchronized(test1.class){
for(int i=1;i<=50;i++){
for(int j=0;j<=10;j++){
System.out.println("main thread sequece of "+j+", loop of"+i);
}
}
}
}
}
结果输出是互斥的:
2、封装临界代码,把代码的同步控制在一个类中。上面例子中的代码同步散落在业务逻辑中,现在我们要做的就是去封装它。
public class test1 {3、上面的封装其实是一种思想,就是把技术层面的东西封装成工具,让开发者更多地去关于业务,而不需要太多在技术实现上投入大多精力。那么如何实现线程之间的通信呢,模型大概是这样的:main线程和sub线程共同判断一个boolean变量,看看该谁执行了。从main线程开始执行,执行完了,把共享的Boolean取反,然后通知sub线程开始执行。如此循环便可以了。
public static void main(String[] args){
final Business business=new Business();
new Thread(new Runnable(){
@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub(i);
}
}
}).start();
for(int i=1;i<=50;i++){
business.main(i);
}
}
}
class Business{
public synchronized void sub(int i){
}
public synchronized void main(int i){
}
}
public class TraditionalThreadCommunication {
public static void main(String[] args){
final Business business=new Business();
new Thread(new Runnable(){
@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub(i);
}
}
}).start();
for(int i=1;i<=50;i++){
business.main(i);
}
}
}
class Business{
private boolean bShouldSub=true;
public synchronized void sub(int i){
while(!bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0;j<=10;j++){
System.out.println("sub thread sequece of "+j+", loop of"+i);
}
bShouldSub=false;
this.notify();
}
public synchronized void main(int i){
while(bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0;j<=10;j++){
System.out.println("main thread sequece of "+j+", loop of"+i);
}
bShouldSub=true;
this.notify();
}
}
总结:多线程中有很多java的精华思想,需要我们去学习。要成为一名优秀的程序员,这些基础知识必须要掌握。