プロジェクト |
コンテンツ |
この作品は、コースに属し |
<教室の教師はホームリンクブログ> https://www.cnblogs.com/nwnu-daizh/ |
どこの仕事でこの要件 |
<ジョブリンクアドレス> https://www.cnblogs.com/nwnu-daizh/p/12073034.html |
ジョブの学習目標 |
(1)プロパティと優先スケジューリング方法スレッドを理解し、マスター; (2)スレッド同期技術の概念と実装を把握します。 (3)Javaのスレッド包括的なプログラミング演習
|
パートI:スレッド同期テクノロジの概要
システム性能を向上させ、システムリソースの利用率を向上させるために、複数のスレッドで同時に実行1.Java。
二つ以上のスレッドがあると仮定2.オブジェクトを共有し、各スレッドは、オブジェクトクラスの状態を変更するメソッドを呼び出して、それが不確実性の原因となります。
3.マルチスレッド実装に関する問題
◆複数のスレッドの実行の相対的な順序は不明です。
◆スレッドの実行順序の不確実性は、結果の不確実性を作成します。
◆多くの場合、共有データにマルチスレッド操作で、この不確実性を生成します。
スレッド同期メカニズムの導入:4.マルチスレッド不確実性溶液を同時に実行します。
5.(1)及び条件オブジェクトのロックオブジェクト
以下と保護ReentrantLockのコードブロックの基本構造:
myLock.lock();
試す{クリティカルセクション}
最後に{
myLock.unlock();
}
(2)キーワードを同期
synchronizedキーワードの役割:
➢同期方法は、方法を変更した後、クラスは、同期方式と呼ばれます。
➢限りスレッドが同期メソッドにアクセスしているように、他のスレッドは、スレッドがフロントからブロックされたスレッド同期メソッドの復帰をウェイクアップするまで、同期方法がブロックされますアクセスしたい、他の当事者は、スレッドの同期方法を入力することもできます。
パートII:実験の部
1 、実験目的と要件
(1)は、スレッド同期技術の概念と実装をつかみ、
(2)総合的なプログラミングの練習のスレッド
2 、実験及びステップ
実験 1:試験手順とコードのコメント。
試験手順 1:
環境デバッグElipseにおけるリットル651社の教科書ページプログラム 14-7 、プログラムの組み合わせにより、プログラムを理解します。
Lは、オブジェクトの実現のための同期ロックオブジェクトと条件をマルチスレッドの使用を習得しました。
次のような実験コードに注意してください。
Bank.java:
パッケージ同期; 輸入java.utilの。*; 輸入java.util.concurrent.locks *。; / ** *銀行の数がA銀行は、アクセスをシリアル化するためのその使用法ロックを占めています。 * @version 1.30 2004-08-01 * @authorケイHorstmann * / publicクラス銀行 { 民間最終ダブル[]占めます。 プライベートロックbankLock。 民間条件sufficientFunds。 / ** *バンクを構築します。 * @param Nアカウントの数 * @param initialBalance各口座の初期残高は * / パブリック銀行(整数nは、二重initialBalance) { アカウント=新しいダブル[N]。 Arrays.fill(アカウント、initialBalance)。 bankLockは新しいReentrantLockのを()=; sufficientFunds = bankLock.newCondition(); //在等待条件前、锁必须由当前线程保持。 } / ** * 1つの口座から別のにお金を転送します。 *アカウントから@paramから転送するため に転送するアカウントに* @param 転送する* @param量量 * / 公共ボイド転送(INTから、INTに、二量)スローをInterruptedExceptionある { bankLock.lock()。 //获取锁 試みる { ながら(アカウント<量【から】) sufficientFunds.await(); //原因となる前に割り込みしてきたが通知され、現在のスレッドまたは待機を状態。 System.out.print(にThread.currentThread())。 【から】アカウント- =量; System.out.printf( "DからD%の%10.2f%"、AMOUNT、へ、から); アカウント+ = AMOUNT【へ]; System.out.printf( "トータルバランス:%N-%10.2f"、 getTotalBalance()); sufficientFunds.signalAll(); //状態で待機しているスレッドのすべての、すべてのスレッドアップウェイク場合 } 最後に { bankLock.unlock(); //ロックを解除します。 } } / ** *取得し、アカウントは、すべてのSUMのバランスを取ります。 * @Returnザ・トータルバランス * / 公共ダブルgetTotalBalance() { bankLock.lock(); 試み { ダブルSUM = 0; SUM + =。 :(アカウントダブルA)のための 合計を返します。 } 最後に { bankLock.unlock()。 } } / ** *銀行での口座の数を取得します。 *アカウントの@return数 * / 公共int型のサイズ() { 戻りaccounts.length。 } }
SynchBankTest.java:
パッケージ同期; / ** *このプログラム番組を複数のスレッドが安全にデータ構造にアクセスすることができますか。 * @version 1.31 2015年6月21日 * @authorケイHorstmann * / publicクラスSynchBankTest { パブリック静的最終int型NACCOUNTS = 100。 public static finalダブルINITIAL_BALANCE = 1000; public static finalダブルMAX_AMOUNT = 1000; public static final int型DELAY = 10; パブリック静的無効メイン(文字列[] args) { バンクBANK =新しい銀行(NACCOUNTS、INITIAL_BALANCE)。 用(INT iは= 0; I <NACCOUNTS; I ++) { int型fromAccount = I。 実行可能R =() - > { トライ { 一方(TRUE) { int型toAccount =(INT)(bank.size()* Math.random())。 重量= MAX_AMOUNT * Math.random(); bank.transfer(fromAccount、toAccount、量)。 Thread.sleep((int型)(DELAY * Math.random())); } } キャッチ(InterruptedExceptionある電子) { } }。 スレッドt =新しいスレッド(R) t.start(); } } }
結果は以下の通りであります:
試験手順2:
Elipse環境で教科書14-8デバッグL 655プログラムは、プログラムの合成結果は、プログラムを理解します。
Lの 把握は、同期マルチスレッドの同期のアプリケーションを。
次のような実験コードに注意してください。
Bank.java:
パッケージsynch2。 輸入java.utilの。*; / ** *銀行の数は、銀行はその用途の同期プリミティブを占めています。 * @version 1.30 2004-08-01 * @authorケイHorstmann * / publicクラス銀行 { 民間最終ダブル[]占めます。 / ** *バンクを構築します。 * @param Nアカウントの数 * @param initialBalance各アカウントの初期バランス * / パブリック銀行(整数nは、二重initialBalance) { アカウント=新しいダブル[N]。 Arrays.fill(アカウント、initialBalance)。 } / ** * 1つの口座から別のにお金を転送します。 *転送から@paramの口座 への口座振替へ* @param 金額の金額転送する* @param * / 公共のボイド(にint型からint型、ダブル量)は、同期転送はInterruptedExceptionあるスロー { からしばらく(アカウントの[ <AMOUNT) 待ち(); //は、他のスレッドが()メソッドまたはのnotifyAll()メソッドは、現在のスレッドを待機させ通知にする前に、このオブジェクトを呼び出す System.out.print(にThread.currentThread()); アカウント[]から- AMOUNT =; System.out.printf( "DからD%の%10.2f%"、AMOUNT、へ、から); アカウント+ = AMOUNT【へ]; System.out.printf(「トータルバランス:%10.2f% 「N-、getTotalBalance()); のnotifyAll(); //このオブジェクトのモニターで待機中のすべてのスレッドを覚まします } / ** *すべての口座残高の合計を取得します。 *トータルバランス@return * / 二重getTotalBalance(同期パブリック) { 二重和= 0。 (ダブルA:口座)について 合計+ =; 合計を返します。 } / ** *銀行での口座の数を取得します。 *アカウントの@return数 * / 公共int型のサイズ() { 戻りaccounts.length。 } }
SynchBankTest2.java:
パッケージsynch2。 / ** *複数のスレッドが安全にデータ構造、アクセスすることができますどのようにこのプログラムのショー synchronizedメソッドを使用して*を。 * @version 1.31 2015年6月21日 * @authorケイHorstmann * / publicクラスSynchBankTest2 { パブリック静的最終int型NACCOUNTS = 100。 public static finalダブルINITIAL_BALANCE = 1000; public static finalダブルMAX_AMOUNT = 1000; public static final int型DELAY = 10; パブリック静的無効メイン(文字列[] args) { バンクBANK =新しい銀行(NACCOUNTS、INITIAL_BALANCE)。 (; I INTはI = 0のための<NACCOUNTS; I ++) { int型fromAccount = I。 実行可能R =() - > { 試み { 一方(TRUE) { int型toAccount =(INT)(bank.size()* Math.random())。 重量= MAX_AMOUNT * Math.random(); bank.transfer(fromAccount、toAccount、量)。 Thread.sleep((int型)(DELAY * Math.random())); } } キャッチ(InterruptedExceptionある電子) { } }。 スレッドt =新しいスレッド(R) t.start(); } } }
次のようにコードの結果は以下のとおりです。
試験手順3:
L Elipseは問題を実行している解析プログラムの結果と併せて、環境の中で次のプログラムを実行します。
lは解決プログラムの問題にしてみてください。
class Cbank { private static int s=2000; public static void sub(int m) { int temp=s; temp=temp-m; try { Thread.sleep((int)(1000*Math.random())); } catch (InterruptedException e) { } s=temp; System.out.println("s="+s); } } class Customer extends Thread { public void run() { for( int i=1; i<=4; i++) Cbank.sub(100); } } public class Thread3 { public static void main(String args[]) { Customer customer1 = new Customer(); Customer customer2 = new Customer(); customer1.start(); customer2.start(); } }
代码运行结果如图:
运行结果显示两个线程各自运行各自的:并没有实现需要的两个线程一起每次减一百,减八次。
修改代码如下:
class Cbank { private static int s=2000; public synchronized static void sub(int m) { int temp=s; temp=temp-m; try { Thread.sleep((int)(1000*Math.random())); } catch (InterruptedException e) { } s=temp; System.out.println("s="+s); } } class Customer extends Thread { public void run() { for( int i=1; i<=4; i++) Cbank.sub(100); } } public class Thread3 { public static void main(String args[]) { Customer customer1 = new Customer(); Customer customer2 = new Customer(); customer1.start(); customer2.start(); } }
运行结果如下:
实验2:结对编程练习包含以下4部分(10分)
1) 程序设计思路简述;
2) 符合编程规范的程序代码;
3) 程序运行功能界面截图;
利用多线程及同步方法,编写一个程序模拟火车票售票系统,共3个窗口,卖10张票,程序输出结果类似(程序输出不唯一,可以是其他类似结果)。
Thread-0窗口售:第1张票
Thread-0窗口售:第2张票
Thread-1窗口售:第3张票
Thread-2窗口售:第4张票
Thread-2窗口售:第5张票
Thread-1窗口售:第6张票
Thread-0窗口售:第7张票
Thread-2窗口售:第8张票
Thread-1窗口售:第9张票
Thread-0窗口售:第10张票
代码如下:
import javax.swing.plaf.SliderUI; public class shou { public static void main(String[] args) { Mythread mythread=new Mythread(); Thread t1=new Thread(mythread); Thread t2=new Thread(mythread); Thread t3=new Thread(mythread); t1.start(); t2.start(); t3.start(); } } /* new Thread() { @Override public void run() { System.out.println(); }; }.start(); } }*/ class Mythread implements Runnable{ int t=1; boolean flag=true; @Override public void run() { while(flag) { try { Thread.sleep(500); } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } synchronized (this) { if(t<=10) { System.out.println(Thread.currentThread().getName()+"窗口售:第"+t+"张票"); t++; } if(t<0) { flag=false; } } } } }
运行结果如图:
实验总结;通过本次实验,我学习到了线程同步的概念,以及如何处理。通过本学期的学习,由刚开始的新手小白,对Java一无所知,到通过大量的练习慢慢对Java编程有所熟悉,虽然现在还不是很熟练,但在课程结束后仍需继续关注学习Java的知识及编程。