JAVA基礎の道——同時(一)
2107 ワード
同時(一)
プロセス、スレッド
プロセスはリソース割り当ての基本単位であり,スレッドはCPUスケジューリングの基本単位である.
スレッドを使用して他のタスクに機会を与える
1)Runnableインタフェースは,タスクコードを配置するためのrunメソッドのみを含む.interface Runnable {
void run();
}
// , Lambda 。
`Runnable r = () ->{};
2)RunnableによってThread(スレッド)オブジェクトが作成されます.Thread t = new Thread(r);
3)スレッドを開始します.t.start;
runメソッドでは、Threadによって呼び出すことができるメソッド:Thread.sleep(ミリ秒);//この方法は、スレッドをスリープさせて、他のスレッドの実行を確保することです.cry/cetchでキャプチャする必要があります.
Thread.yield();//この方法は他のスレッドにCPU時間を一時的に与えるが,効果は一般的である.
join();//あるrunメソッドでは、あるスレッドでこのメソッドを呼び出すと、このrunメソッドの実行中にjoinを呼び出すこのスレッドを実行することができ、このスレッドが実行されてからrunメソッドを実行することができます.
スレッドは、Threadクラスのサブクラスを構築することによって定義することもできます.public class MyThread {
public void run(){}
}
次にサブクラスオブジェクトを構築し、startメソッドを呼び出して起動します.
警告:runメソッドを呼び出さないでください.runメソッドを直接呼び出すと、同じスレッド内のタスクのみが実行され、新しいスレッドは起動されません.Threadを呼び出すべきです.startメソッドはrunメソッドを実行する新しいスレッドを作成します.
割り込みスレッド
スレッドは実行中に終了または中断される可能性があります.理由は、スレッドの実行が完了すると自動的に終了します.runメソッドではif文判断があり、成立するとreturnが返されます.runメソッドで実行時異常が発生したり、異常を投げ出したりしてプロセスを中断したりします.プロセスを終了する方法もあります.stopメソッド(古い):プロセスinterruptメソッドを終了します.(古い):各スレッドにはbooleanフラグがあり、すべてのスレッドは実行中に時々このフラグをチェックして、スレッドが中断されたかどうかを判断します.interruptメソッドを呼び出すと、スレッドの中断状態がセットされ、言い換えればスレッドは毎回このフラグで自分が「自殺」すべきかどうかを判断する.まず、現在のスレッドの中断位置が置換されているかどうかを明らかにするには、メソッドThreadを呼び出す必要があります.CurrentThreadは現在のスレッドを取得し、isInterruptedメソッドを呼び出します.while(!Thread.currentThread().isInterrupted() && true/* true */)
/*Thread.currentThread() , false
while 。
*/
}
プロセスのフラグがセットされると、whileサイクル条件が満たされなくなり、プロセスは自然に終了します.注意:プロセスがsleepまたはwait状態にある場合、interruptメソッドを呼び出すとエラーが表示されます.
boolean isInterrupted();//現在のスレッドフラグステータスを読み込むために使用します.boolean static interrupted();//現在のプロセスフラグのステータスを読み出し、元が真であっても偽であっても偽void interrupt()に設定します./ビットスレッドフラグ状態をfalseからtrueに変更するために使用され、スレッドがsleepされると異常static Thread currentThread()/メソッドは現在のスレッドを返します
以上学んだことは個人の総括である.厳格ではないのは避けられないが,許してください.
interface Runnable {
void run();
}
// , Lambda 。
`Runnable r = () ->{};
Thread t = new Thread(r);
t.start;
public class MyThread {
public void run(){}
}
while(!Thread.currentThread().isInterrupted() && true/* true */)
/*Thread.currentThread() , false
while 。
*/
}