JAvaマルチスレッド--チケット購入(ticket)実験
2562 ワード
1.Threadを継承する方法:
結果として10枚のチケットを購入したが、5枚のチケットしかなく、共有リソースの目的を達成できなかったため、以下ではRunnableインタフェースを実現する
2.Runnableを実現する方法:
2スレッドでしたが5枚のチケットを購入しただけで、リソース共有の目的を達成できました.
プログラムに遅延を追加するには:
結果:
この結果を信じて皆さんは原因を知っています.ここでは説明しません.上のコードを同期すればいいです.
3.スレッド間の同期
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();
}
}