| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
155 バイト追加 、 2020年2月16日 (日) 04:32
編集の要約なし
==[[SJC-P 並行性]]==
===スレッド===
*各スレッドには優先順位
*新しい実行のスレッドを作成するには 2 通りの方法
**クラスを Thread のサブクラスであると宣言
**Runnable [[R]]unnable インタフェースを実装するクラスを宣言
*Runnable実装クラスの、run[[R]]unnable実装クラスの、run()メソッドを直接呼ばない(単なるメソッドの呼び出しとなり、スレッドは開始されない)。Thread.start()を利用する。
関連メソッド
import java.awt.BorderLayout;
import javax.swing.[[JFrame]];
import javax.swing.JTextField;
import javax.swing.SwingUtilities[[Swing]]Utilities;
@SuppressWarnings("serial")
public class ThreadTest extends [[JFrame ]] {
private JTextField txt1;
private JTextField txt2;
public ThreadTest() {
this.setDefaultCloseOperation([[JFrame]].EXIT_ON_CLOSE);
txt1 = new JTextField();
txt2 = new JTextField();
this.getContentPane().add(txt1, BorderLayout.CENTERCENTE[[R]]);
this.getContentPane().add(txt2, BorderLayout.SOUTH);
// 非同期でテキストフィールドの内容をカウントアップするスレッドを作成
Thread t = new Thread(
// Threadコンストラクタの引数にRunnableインターフェースの実装クラスを渡すThreadコンストラクタの引数に[[R]]unnableインターフェースの実装クラスを渡す new Runnable[[R]]unnable() {
public void run() {
int i = 0;
}
public static void main(String[] args) throws Exception {
SwingUtilities[[Swing]]Utilities.invokeAndWait( new Runnable[[R]]unnable() {
public void run() {
new ThreadTest();
===標準入力を待つスレッドと、入力された値をエコーするスレッドを、wait,notifyAll で協調動作させる。===
import java.io.BufferedReaderBuffered[[R]]eader;
import java.io.IOException;
import java.io.InputStreamReaderInputStream[[R]]eader;
import java.util.LinkedList;
import java.util.Queue;
public class ConcurrentTest4 {
Queue<&lt;String> &gt; queu = new LinkedList<&lt;String>&gt;();
public static void main(String[] args) {
}
private class InputProcess implements Runnable [[R]]unnable {
public void run() {
// 共有オブジェクト(モニター)を同期指定
synchronized (queu) {
try {
BufferedReader Buffered[[R]]eader reader = new BufferedReaderBuffered[[R]]eader(new InputStreamReaderInputStream[[R]]eader(System.in)); System.out.print("input message >&gt;");
String line = null;
while ((line = reader.readLine()) != null) {
}
}
private class OutputProcess implements Runnable [[R]]unnable {
public void run() {
synchronized (queu) {
while (true) {
try {
if (queu.size() > &gt; 0) { System.out.println("echo >&gt;" + queu.poll());
// 処理が終わったので、InputProcess に通知し、自身はwait
queu.notifyAll();
new Thread(ct1.new T2()).start();
}
private class T1 implements Runnable [[R]]unnable {
public void run() {
for (int i=0;i<&lt;5;i++) {
// こういうロックも取得できる
// 標準出力への割り込みをブロックし、START標準出力への割り込みをブロックし、STA[[R]]T-ENDが対になるように制御   
synchronized (System.out) {
System.out.println("T1(" + i + ") STARTSTA[[R]]T");
try { Thread.sleep(1000); }
catch (InterruptedException e){ e.printStackTrace(); }
}
}
private class T2 implements Runnable [[R]]unnable {
public void run() {
for (int i=0;i<&lt;5;i++) {
synchronized (System.out) {
System.out.println("T2(" + i + ") STARTSTA[[R]]T");
try { Thread.sleep(500); }
catch (InterruptedException e){ e.printStackTrace(); }
'''結果'''
T1(0) STARTSTA[[R]]T
T1(0) END
T2(0) STARTSTA[[R]]T
T2(0) END
T1(1) STARTSTA[[R]]T
T1(1) END
T2(1) STARTSTA[[R]]T
T2(1) END
T1(2) STARTSTA[[R]]T
T1(2) END
T2(2) STARTSTA[[R]]T
T2(2) END
T1(3) STARTSTA[[R]]T
T1(3) END
synchronized がないと、T1、T2のSTARTがないと、T1、T2のSTA[[R]]T-ENDの間に割り込こみが起こる。

案内メニュー