java多线程问题集锦(一)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java多线程问题集锦(一)

java多线程问题集锦(一)

 2011/10/10 8:06:09  jsczxy2  http://jsczxy2.iteye.com  我要评论(0)
  • 摘要:问题:设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,运行1000次(可以每个各执行250次也可自己计算只要总合1000),J初始为100,保证结果为100,写出程序PS:这里主要用到了synchronized以及对象的wait和notify以及notifyAll方法packagecom.test;publicclassTestThread{publicstaticvoidmain(String[]args){Operateo=newOperate()
  • 标签:多线程 Java 问题 线程

问题:设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,运行1000次(可以每个各执行250次也可自己计算只要总合1000),J初始为100,保证结果为100,写出程序

PS:这里主要用到了synchronized以及对象的wait和notify以及notifyAll方法

?

package com.test;




public class TestThread{

	public static void main(String[] args) {
		Operate o = new Operate();
		IncreaseThread thread1 = new IncreaseThread(o);
		IncreaseThread thread2 = new IncreaseThread(o);
		DecreaseThread thread3 = new DecreaseThread(o);
		DecreaseThread thread4 = new DecreaseThread(o);
		thread1.start();
		thread2.start();
		thread3.start();
		thread4.start();
	}
	
}
	class Operate{
		
		private int j=100;
		private int count = 0;
		
		public synchronized void increase(){
			System.out.println("increase in");
			while(100!=j){
				try {
					System.out.println(Thread.currentThread().getName()+"increase begin wait");
					wait();
					System.out.println(Thread.currentThread().getName()+"increase end wait");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			j++;
			System.out.println("increase j:"+j);
			count++;
			System.out.println("increase count:"+count);
			//切勿使用notify();只唤醒一个线程是不行的,因为有两个相同功能的线程会导致这2个线程都wait然后再通知到另外2个相同功能的线程又会2个线程都wait最终可能全部4个线程全部wait
			notifyAll();
			System.out.println("increase out");
		}

		public synchronized void decrease(){
			System.out.println("decrease in");
			while(100==j){
				try {
					System.out.println(Thread.currentThread().getName()+"decrease begin wait");
					wait();
					System.out.println(Thread.currentThread().getName()+"decrease end wait");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			j--;
			System.out.println("decrease j:"+j);
			count++;
			System.out.println("decrease count:"+count);
			//切勿使用notify();只唤醒一个线程是不行的,因为有两个相同功能的线程会导致这2个线程都wait然后再通知到另外2个相同功能的线程又会2个线程都wait最终可能全部4个线程全部wait
			notifyAll();
			System.out.println("decrease out");
		}
		
	}
	
	class IncreaseThread extends Thread{
		private  Operate o;
		
		public IncreaseThread(Operate o) {
			this.o = o;
		}
		@Override
		public void run() {
			for(int i = 0;i<250;i++){
				o.increase();
			}
		}
	}
	
	class DecreaseThread extends Thread{
		private  Operate o;
		
		public DecreaseThread(Operate o) {
			this.o = o;
		}
		@Override
		public void run() {
			for(int i = 0;i<250;i++){
				o.decrease();
			}
		}
	}
	
发表评论
用户名: 匿名