java多线程操作

java多线程操作,对于具体的操作应当把业务代码作为一个业务类进行操作。在业务类里面进行线程的互斥同步操作。具体的看下面的例子:

package test.client;

public class Test2018 {
	public static void main(String[] args) {
		final ThreadTask threadTask = new ThreadTask();//业务任务对象
		new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<50;i++){
					threadTask.loopTask();//子线程任务
				}
			}
		}).start();
		for(int i=0;i<50;i++){
			threadTask.mainTask();//主线程任务
		}
	}
}

class ThreadTask{
	private boolean flag = true;//主线程、子线程运行标志
	public synchronized void loopTask() {
		while(!flag){//防止线程虚假唤醒
			try {
				this.wait();//线程等待
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		for(int i=1;i<=100;i++) {
			System.out.println("子线程执行:"+i);
		}
		flag = false;
		this.notify();//唤醒线程
	}
	public synchronized void mainTask() {
		while(flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		for(int i=1;i<=50;i++) {
			System.out.println("主线程执行:"+i);
		}
		flag = true;
		this.notify();
	}
}

 注意点:两个线程之间的有序通信需要线程进行等待和唤醒。

比如一个线程被等待了,它能被另一个线程唤醒,也可以自己醒来(伪唤醒)。我们可以在两个线程之间设置一个私有变量,无论是被唤醒还是自己伪唤醒的都会检查一下这个变量咱去执行自己的代码,这样会变得很安全。

每个业务方法都会加上synchronized这样方法的 实例就会像被对象一样的进行锁定。

猜你喜欢

转载自747017186.iteye.com/blog/2409186