💬
ITスクール DAY21 Thread(スレッド)
Thread(スレッド)
OSにより管理される一つの作業もしくはタスク(軽量プロセス)だ。
このスレッドを同時に運用する方法をマルチスレッドという。
開発者:遂行する作業をプログラムコードで作成。
OS(Operation System):プロセス・スレッドで実行
JavaプログラムのスレッドはJVMがコントロールする。
一つのJVMは、一つの応用プログラムのみ実行し、
java applicationの実行のため、JVMが実行され、
java applicationが終了されば、JVMもともに終了される。
mainスレッド
javaは、JVMが実行されば、mainスレッドを作り、このスレッドがmain()メソッドを実行させる。
public class Test
public static void main(String[] args) {
Thread thread = new Thread();
System.out.println(thread.currentThread());
}
}
Thread[main,5,main]
また、スレッドのインスタンスメソッドを通して、スレッドの情報を確認することもできる。
public class ThreadEx3 {
public static void main(String[] args) {
long id = Thread.currentThread().getId();
String name = Thread.currentThread().getName();
int priority = Thread.currentThread().getPriority();
Thread.State s = Thread.currentThread().getState();
System.out.println("Thread id : " + id);
System.out.println("Thread name : " + name);
System.out.println("Thread Priority : " + priority);
System.out.println("Thread status : " + s);
}
}
Thread id : 1
Thread name : main
Thread Priority : 5
Thread status : RUNNABLE
スレッド終了
<シングルスレッドの場合>
run()スレッドがリターンすれば、スレッドは終了される。
<マルチスレッドの場合>
Aスレッドのrun()メソッド実行中、
Bスレッドのinterrupt()メソッドを呼び出せば、
BスレッドのInterruptedException例外が発生し、
Bスレッドがこの例外を受け、リターンするば、
Aスレッドは実行完了され、正常終了される。
マルチスレッド
class SharePrinter{
void print(String text) {
for(int i = 0; i< text.length(); i++) {
System.out.print(text.charAt(i));
}
System.out.println();
}
}
class WorkerThread extends Thread{ //Thread
private SharePrinter p; //Put in SharePrinter's object address
private String[] text;
public WorkerThread(SharePrinter p, String[] text) {
this.p = p;
this.text = text;
}
@Override
public void run() {
for(int i=0; i< text.length; i++) {
p.print(text[i]);
}
}
}
public class ThreadEx4 {
public static void main(String[] args) {
SharePrinter p = new SharePrinter();
String[] entText = { "Twinkle Twinkle, Little Star",
"How I wonder what you are",
"Up above the world so high",
"Like a diamond in the sky",
"Twinkle Twinkle Little Star",
"How I wonder what you are!" };
String[] korText = { "반짝반짝 작은별",
"나는 네가 무엇인지 궁금해",
"세상 저 높은곳에서",
"하늘의 다이아몬드처럼",
"반짝반짝 작은별",
"나는 네가 무엇인지 궁금해" };
Thread th1 = new WorkerThread(p,entText);
Thread th2 = new WorkerThread(p,korText);
th1.start();
th2.start();
}
}
Twink반짝반짝 작은별le Twinkle, Li
나는 네가 무엇인지 궁금해
세상 저ttle S tar
Ho높w I won은곳에서
하늘의 다이아몬드처럼
반짝반짝 작der what you 은별
나는 네가 무엇인지 궁금해
are
Up above the world so high
Like a diamond in the sky
Twinkle Twinkle Little Star
How I wonder what you are!
二つのスレッドが作業を同時に行っているが、順序がぐちゃぐちゃになあている。
同期化がされていないため、データーのロスが行う可能性もあるため、
動機がする必要がある。この場合、一番上にある、2番コードを同期化すれば解決できる。
synchronized void print(String text)
Twinkle Twinkle, Little Star
반짝반짝 작은별
나는 네가 무엇인지 궁금해
세상 저 높은곳에서
하늘의 다이아몬드처럼
반짝반짝 작은별
나는 네가 무엇인지 궁금해
How I wonder what you are
Up above the world so high
Like a diamond in the sky
Twinkle Twinkle Little Star
How I wonder what you are!
Discussion