Dieser Artikel teilt Ihnen hauptsächlich den relevanten Inhalt zum Blockieren und Aufwachen im Java-Multithreading mit. In diesem Artikel können Sie die Methoden zum Aufrufen des Thread-Blockierungsstatus und des ausführbaren Status grob verstehen Es.
Java-Thread-Blockierung und Aufwachen
1. Sleep()-Methode:
Sleep (...Millisekunden) gibt die Zeit in Millisekunden an, in der der Thread innerhalb dieser Zeit in den Thread-Blockierungszustand wechselt, während der die CPU-Zeitscheibe nicht abgerufen wird. Nach Ablauf der Zeit wechselt der Thread erneut in den ausführbaren Zustand. (Beim Anhalten des Threads wird die Sperre nicht aufgehoben)
//测试sleep()方法 class Thread7 implements Runnable{ @Override public void run() { for(int i=0;i<50;i++){ System.out.println(Thread.currentThread().getName()+"num="+i); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Thread8 implements Runnable{ @Override public void run() { for(int i=0;i<1000;i++){ System.out.println(Thread.currentThread().getName()+"num="+i); } } } public static void main(String[] args) { /* * 测试线程阻塞 */ //测试sleep()方法 Thread7 t7=new Thread7(); Thread8 t8=new Thread8(); Thread t81=new Thread(t8, "饺子"); Thread t71=new Thread(t7, "包子"); Thread t72=new Thread(t7, "面包"); t71.start(); t81.start(); t72.start(); }
2.suspend()- und resume()-Methoden:.
Durch Anhalten und Aufwecken des Threads wird der Thread in den Blockierungszustand versetzt. Der Thread wechselt nur dann in den ausführbaren Zustand, wenn der entsprechende Resume() aufgerufen wird. (Nicht empfohlen, da es leicht zu einem Deadlock kommt)
//测试suspend()和resume()方法 class Thread9 implements Runnable{ @Override public void run() { for(long i=0;i<500000000;i++){ System.out.println(Thread.currentThread().getName()+" num= "+i); } } } public static void main(String[] args) { //测试suspend和resume Thread9 t9=new Thread9(); Thread t91=new Thread(t9,"包子"); t91.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t91.suspend(); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t91.resume(); }
(Wenn die Konsole die Ausgabe druckt, hält sie 2 Sekunden lang an und druckt dann weiter.)
3. yield()-Methode:
führt dazu, dass der Thread die aktuelle CPU-Zeitscheibe aufgibt, sich der Thread jedoch noch in der ausführbaren Datei befindet Zustand kann die CPU-Zeitscheibe jederzeit erneut zugewiesen werden. Die yield()-Methode kann nur Threads mit derselben Priorität eine Chance zur Ausführung geben. Der Effekt des Aufrufs von yield() ist gleichbedeutend damit, dass der Scheduler davon ausgeht, dass der Thread genügend Zeit ausgeführt hat, um zu einem anderen Thread zu wechseln. (Halten Sie den aktuell ausgeführten Thread an und führen Sie andere Threads aus. Die angegebene Zeit ist unbekannt.)
//测试yield()方法 class Thread10 implements Runnable{ @Override public void run() { for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" num= "+i); if(i==33){ Thread.yield(); } } } } public static void main(String[] args) { //测试yield Thread10 t10 =new Thread10(); Thread t101=new Thread(t10, "包子"); Thread t102=new Thread(t10, "面包"); t101.start(); t102.start(); } /* 运行结果为: …… 包子 num= 24 包子 num= 25 包子 num= 26 包子 num= 27 包子 num= 28 包子 num= 29 包子 num= 30 包子 num= 31 包子 num= 32 包子 num= 33 面包 num= 0 面包 num= 1 面包 num= 2 面包 num= 3 …… 面包 num= 30 面包 num= 31 面包 num= 32 面包 num= 33 包子 num= 34 包子 num= 35 包子 num= 36 包子 num= 37 包子 num= 38 …… */
(Wie Sie sehen können, hat Alternation bei einer Zahl von 33 einen Wert aufgetreten. )
4.wait() und notify() Methoden:
Verwenden Sie beide Methoden zusammen, wait() Fügen Sie den Thread ein Wenn notify() aufgerufen wird, wechselt der Thread in den ausführbaren Zustand. Sie können in wait() Parameter hinzufügen oder nicht. Die Einheit ist Millisekunden. Wenn die angegebene Zeit erreicht ist oder die notify()-Methode aufgerufen wird, wechselt sie in den ausführbaren Zustand. (Wait () gehört zur Object-Klasse und nicht zur Thread-Klasse und gibt zuerst das gesperrte Objekt frei und führt dann die Warteaktion aus. Da das von wait () erwartete Objekt zuerst gesperrt werden muss, kann es nur zur Synchronisierung verwendet werden . Programmsegment oder synchronisierte Methode, andernfalls wird eine Ausnahme „IllegalMonitorStateException“ ausgelöst
Auch Thread-Verbindung genannt. Der aktuelle Thread A ruft die Methode „join()“ eines anderen Threads B auf. Der aktuelle Thread A wechselt in den Blockierungsstatus. Erst wenn Thread B die Ausführung beendet, wechselt Thread A vom Blockierungsstatus in den ausführbaren Status.
//测试wait()和notify()方法 //用生产者和消费者模式模拟这一过程 /*消费者 */ class Consumer implements Runnable { private Vector obj; public Consumer(Vector v) { this.obj = v; } public void run() { synchronized (obj) { while (true) { try { if (obj.size() == 0) { obj.wait(); } System.out.println("消费者:我要买面包。"); System.out.println("面包数: " + obj.size()); obj.clear(); obj.notify(); } catch (Exception e) { e.printStackTrace(); } } } } } /* 生产者 */ class Producter implements Runnable { private Vector obj; public Producter(Vector v) { this.obj = v; } public void run() { synchronized (obj) { while (true) { try { if (obj.size() != 0) { obj.wait(); } obj.add(new String("面包")); obj.notify(); System.out.println("生产者:面包做好了。"); Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); } } } } } public static void main(String[] args) { //测试wait()和notify() Vector obj = new Vector(); Thread consumer = new Thread(new Consumer(obj)); Thread producter = new Thread(new Producter(obj)); consumer.start(); producter.start(); }
Zusammenfassung
Das obige ist der detaillierte Inhalt vonBeispielcode für Multithread-Blockierung und Reaktivierung in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!