JAvaマルチスレッド--チケット購入(ticket)実験

2562 ワード

1.Threadを継承する方法:
package org.sh.diffdemo;

public class MyThread extends Thread {
	private int ticket = 5;
	public void run(){
		for(int i =0;i<10;i++){
			if(this.ticket>0){
				System.out.println("  :ticket="+this.ticket--);
			}
		}
	}
}
package org.sh.diffdemo;

public class ThreadTicket {
	public static void main(String[] args) {
		MyThread m1 = new MyThread();
		MyThread m2 = new MyThread();
		m1.start();
		m2.start();
	}
}

結果として10枚のチケットを購入したが、5枚のチケットしかなく、共有リソースの目的を達成できなかったため、以下ではRunnableインタフェースを実現する
2.Runnableを実現する方法:
package org.sh.diffdemo1;

public class MyThread implements Runnable {
	private int ticket = 5;
	public void run(){
		for(int i =0;i<10;i++){
			if(this.ticket>0){
				System.out.println("  :ticket="+this.ticket--);
			}
		}
	}
}
package org.sh.diffdemo1;

public class ThreadTicket {
	public static void main(String[] args) {
		MyThread m1 = new MyThread();
		Thread t1 = new Thread(m1);
		Thread t2 = new Thread(m1);
		t1.start();
		t2.start();
	}
}

2スレッドでしたが5枚のチケットを購入しただけで、リソース共有の目的を達成できました.
プログラムに遅延を追加するには:
package org.sh.syndemo;

 class MyThread implements Runnable {
	private int ticket = 5;
	public void run(){
		for(int i =0;i<10;i++){
			if(this.ticket>0){
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("  :ticket="+this.ticket--);
			}
		}
	}
}

public class SynDemo01 {
	public static void main(String[] args) {
		MyThread m1 = new MyThread();
		Thread t1 = new Thread(m1);
		Thread t2 = new Thread(m1);
		t1.start();
		t2.start();
	}
}

結果:
  :ticket=5
  :ticket=5
  :ticket=4
  :ticket=4
  :ticket=3
  :ticket=2
  :ticket=1
  :ticket=0

この結果を信じて皆さんは原因を知っています.ここでは説明しません.上のコードを同期すればいいです.
3.スレッド間の同期
package org.sh.syndemo;

 class MyThread implements Runnable {
	private int ticket = 5;
	public void run(){
		for(int i =0;i<10;i++){
			this.sale();
		}
	}
	public synchronized void sale(){
			if(this.ticket>0){
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("  :ticket="+this.ticket--);
		}
	}
}

public class SynDemo01 {
	public static void main(String[] args) {
		MyThread m1 = new MyThread();
		Thread t1 = new Thread(m1);
		Thread t2 = new Thread(m1);
		t1.start();
		t2.start();
	}
}