スレッドVSのRunnableのJavaのマルチスレッド

VSのRunnableスレッド

次の2つの方法の比較:

  • 道にJavaの単一継承特性を持っによる不具合を回避するためのRunnable方法スレッド
  • 実行可能コードは、同じリソース複数のスレッドを処理するために複数のスレッド(スレッド例)を共有することができます。(Runnableオブジェクトと同一のリソースを参照)
  • 発券手続きが同期を追加する必要がセキュア(同期)
class MyThread extends Thread{
	private int tickets=5;
	private String name;//窗口,也是线程的名字
	
	public MyThread(String name) {
		super();
		this.name = name;
	}
	
	@Override
	public void run() {
		while(tickets > 0) {
			tickets--;
			System.out.println(name+"卖了1张票,剩余票数:"+tickets);
		}
	}
}

public class TicketsThread{
//共卖了15张票
	public static void main(String[] args) {
		//创建三个线程,模拟三个窗口卖票
		MyThread mt1 = new MyThread("窗口1");
		MyThread mt2 = new MyThread("窗口2");
		MyThread mt3 = new MyThread("窗口3");
				
		//启动三个线程,开始卖票
		mt1.start();
		mt2.start();
		mt3.start();
	}

}

class MyThread implements Runnable{
	private int tickets=5;
	
	@Override
	public void run() {
		while(tickets > 0) {
			tickets--;
			System.out.println(Thread.currentThread().getName()+"卖了1张票,剩余票数:"+tickets);
		}
	}
}

public class TicketsRunnable {

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		//创建三个线程来模拟三个售票窗口
		Thread t1=new Thread(mt,"窗口1");
		Thread t2=new Thread(mt,"窗口2");
		Thread t3=new Thread(mt,"窗口3");
		
		//说明三个窗口各卖5张票
/*		MyThread mt1 = new MyThread();
		MyThread mt2 = new MyThread();
		MyThread mt3 = new MyThread();
		//创建三个线程来模拟三个售票窗口
		Thread t1=new Thread(mt1,"窗口1");
		Thread t2=new Thread(mt2,"窗口2");
		Thread t3=new Thread(mt3,"窗口3");*/
		
		t1.start();
		t2.start();
		t3.start();
	}
}

概要:この方法でマルチスレッドのRunnableの使用を作成します。

スレッドのライフサイクルとスレッドガード

ライフサイクルのスレッド
ライフサイクルのスレッド:

  • 準備:スレッドオブジェクトを作成した後、スレッドは、start()メソッドを呼び出し(注操作の条件で、取得のCPUサービスを待機して、この時点でスレッドキューにのみスレッドが、必ずしもそうではないが稼働中です)

  • ラン:スレッドは準備ができて、一度取得したCPUリソース、実行状態に入り、ロジック内のrun()メソッドを開始しました。

  • 終了:スレッドを実行()メソッドが終了するか、またはスレッドが停止()を呼び出しメソッド(このメソッドが実行排除された)、スレッドは、最終状態に入ります。

  • 妨害:何らかの理由では一時的に、CPUリソースをあきらめ、その実行を中断するために、睡眠()メソッドを呼び出すと、ブロックされた状態になりますため、スレッドは、いくつかのケースで実行されています。
    Javaは2つのタイプがありますスレッド

  • ユーザースレッド:フォアグラウンドで、特定のタスクを実行するには

    • ネットワークに接続されているメインスレッドは、すべての子スレッドのユーザースレッドです。
  • デーモンスレッド:バックグラウンドで実行されている、他のサービスのフォアグラウンドスレッド

    • 特長:すべてのエンドユーザスレッドが実行されているしたら、デーモンスレッドの終了とJVMで動作します。
    • 用途:
      データベース接続プールは、スレッドの監視
      、仮想マシンが起動した後、モニターのJVMのスレッドを
      最も一般的なスレッドガードを:ガベージコレクションのスレッド
  • デーモンスレッドを設定する方法:

    • 現在のスレッドは、setdaemonスレッドクラスによってデーモンスレッド(true)メソッドとして設定することができます
    • 注意:
      • (真)は、setdaemonは、それ以外の場合は例外ないIllegalThreadStateExceptionがスローされます、start()メソッドの前に呼び出されなければなりません
      • デーモンスレッドで生産新しいスレッドがデーモンスレッドであります
      • すべてのタスクは、読み取りおよび書き込み操作や計算ロジックとして、実行するデーモンスレッドに割り当てることができません
/**
 * 模拟: 守护线程:很长一段时间向文件中写数据
 * 		主线程:会阻塞等待来自键盘的输入,一旦获取用户的输入阻塞解除,主线程继续运行,直到结束(守护线程也会随JVM一起结束运行)。
 */
class DaemonThread implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("进入守护线程:"+Thread.currentThread().getName());
		try {
			writeToFile();
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("退出守护线程:"+Thread.currentThread().getName());
	}

	private void writeToFile() throws Exception{
		File filename = new File("daemon.txt");
		OutputStream os = new FileOutputStream(filename,true);
		int count=0;
		while(count <99) {
			os.write(("\r\nword"+count).getBytes());
			System.out.println("守护线程"+Thread.currentThread().getName()
					+"向文件中写入了word"+count++);
			Thread.sleep(1000);
		}
	}
}

public class DaemonThreadDemo {

	public static void main(String[] args) {
		System.out.println("进入主线程"+Thread.currentThread().getName());
		DaemonThread dt = new DaemonThread();
		Thread t = new Thread(dt);
		t.setDaemon(true);
		t.start();
		
		Scanner sc = new Scanner(System.in);
		sc.next();
 		System.out.println("退出了主线程"+Thread.currentThread().getName());
	}

}

公開された13元の記事 ウォン称賛11 ビュー229

おすすめ

転載: blog.csdn.net/wangailin666/article/details/105128975