💬

ITスクール DAY21 Thread(スレッド)

2023/08/08に公開

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