>  기사  >  Java  >  Java의 기본 다시 얻기(18): 멀티스레딩 요약

Java의 기본 다시 얻기(18): 멀티스레딩 요약

黄舟
黄舟원래의
2017-01-16 10:34:391620검색

자바의 기본을 되찾다(18): 멀티스레딩에 따른 요약

1. 교착상태

1. 스레드 안전 문제는 해결되었지만 동기화 잠금으로 인해 교착 상태 문제가 발생합니다. 2. 교착 상태는 서로가 서로의 리소스를 점유하여 프로그램이 일시 중지되고 계속 실행될 수 없음을 의미합니다. 3. 교착상태가 발생할 확률은 매우 낮지만 피해는 매우 크다. 4. 사례: 오바마와 푸틴이 함께 식사했습니다. 음식이 모두 나왔습니다. 배가 매우 고팠습니다. 하지만 각자 손에 젓가락 하나만 들고 있습니다. 젓가락을 공유할 의향이 있으면 배고플 수밖에 없습니다....욕심쟁이...타액...a.오바마는 먹고 싶어하고 푸틴의 젓가락을 원합니다. 푸틴이 먹고 싶어 ,오바마의 젓가락을 원한다 c. 중첩 자물쇠 + 십자 자물쇠

Java의 기본 다시 얻기(18): 멀티스레딩 요약

Java의 기본 다시 얻기(18): 멀티스레딩 요약

Java의 기본 다시 얻기(18): 멀티스레딩 요약


참고: 스레드가 서로 필요한 리소스를 점유하면 교착 상태가 됩니다.

2.

1、在实现线程安全时,程序进入同步代码块后就会自动上锁,直到程序把代码块中的代码执行完后才会进行下步操作。
2、每个对象都有一把锁,那么开锁的方法就被定义到了Object类中;    
Public final void wait(),让当前线程等待,同时释放锁,直到被再次唤醒。    
public final void wait(long timeout),在指定时间内让当前线程等待,同时释放锁,     
wait()和sleep()都可以让当前线程等待,区别:            
1,sleep():释放执行权(等待),不释放锁           
2,wait():释放执行权(等待),同时释放锁如果调用的是无参的wait()方法,那锁就一直释放,当前线程一直等待,还需要唤醒。
Object类提供了notify()方法用来唤醒某个被wait()的锁,也就是唤醒线程细节:
wait()和notify()方法都是操作锁的,而锁存在于同步中,也就是说这两个方法必须出现在同步中(同步代码块或同步方法)。
同步锁不仅可以解决昨天的线程安全问题,还可以实现线程间的通信3、线程间的通信    
例子:一个线程输出10次1,一个线程输出10次2,观察执行结果          
 现要求交替输出“1 2 1 2 1 2...” 或 “2 1 2 1 2 1...
 public class Testnotif1 extends Thread{    
 public void run(){        
 for (int i = 0; i < 10; i++) {            
 synchronized (MyLocd.o1) {                
 System.out.println(1);                
 MyLocd.o1.notify();                
 try {                    
 MyLocd.o1.wait();                
 } catch (InterruptedException e) {                    
 // TODO Auto-generated catch block                    
 e.printStackTrace();                
 }            
 }        
 }    
 }
 }
 package cn.itcast.Thread;
 public class Testnotif2 extends Thread {    
 public void run() {        
 for (int i = 0; i < 10; i++) {            
 synchronized (MyLocd.o1) {                
 System.out.println(2);                
 MyLocd.o1.notify();                
 try {                    
 MyLocd.o1.wait();                
 } 
 catch (InterruptedException e) {                    
 e.printStackTrace();                
 }            
 }        
 }    
 }}
 package cn.itcast.Thread;
 public class Testnotif {    
 public static void main(String[] args) {        
 // TODO Auto-generated method stub        
 Testnotif1 f1=new Testnotif1();        
 Testnotif2 f2=new Testnotif2();        
 f1.start();        
 f2.start();    
 }}线程之间是互相独立,这个通信指的是线程之间互相打个招呼,控制CPU  的随机性notify()方法     叫醒正在休息的线程     
 Object类该方法只能叫醒跟他共用一把锁(这把锁类似于中间人)的那个线程

    소비자 패턴 생성
    스레드 간 통신 클래식 사례
  1. 2. 분석 a. 농부는 실이고, 끊임없이 상자에 과일을 담는다 생산자

b 아이는 실이고, 끊임없이 상자에서 과일을 먹는다

c. 무한 루프를 사용해야 합니다

d. sleep()을 사용하여 생산 속도와 소비 속도를 시뮬레이션하고 제어할 수 있습니다

e. 상자가 가득 차면 농부에게 문의하세요. 중지 f. 상자에 과일이 없습니다. 아이가 중지하도록 합니다

g. 서로 깨우기 코드 데모:

public class MyLocd {    
public static Object o1=new Object();    
public static Object o2=new Object();}package cn.itcast.Thread;
public class TestHaizi extends Thread{    
public void run(){       
 while(true){           
 synchronized (Kuang.al) {                
 if (Kuang.al.size() <= 0) {                    
 try {                        
 Kuang.al.wait();                    
 } catch (InterruptedException e) {                        
 // TODO Auto-generated catch block                        
 e.printStackTrace();                    
 }                
 }                
 Kuang.al.remove(0);                
 Kuang.al.notify();                
 System.out.println("孩子吃了一个,框里还有" + Kuang.al.size() + "个水果!");                
 try {                    
 Thread.sleep(1000);                
 } catch (InterruptedException e) {                    
 // TODO Auto-generated catch block                    
 e.printStackTrace();                
 }            
 }        
 }    
 }}package cn.itcast.Thread;
 public class Testnongfu extends Thread{    
 public void run(){        
 while(true){            
 synchronized (Kuang.al) {                
 if (Kuang.al.size() >= 30) {                    
 try {                        
 Kuang.al.wait();                   
 } catch (InterruptedException e) {                        
 // TODO Auto-generated catch block                        
 e.printStackTrace();                    
 }                
 }                
 Kuang.al.add(1);                
 Kuang.al.notify();                
 System.out.println("农夫在框里放了一个,框里总共" + Kuang.al.size() + "个水果!");                
 try {                    
 Thread.sleep(500);                
 } catch (InterruptedException e) {                    
 // TODO Auto-generated catch block                    
 e.printStackTrace();                
 }            
 }        
 }    
 }}package cn.itcast.Thread;
 public class TestNongfuHaozi {    
 public static void main(String[] args) {        
 // TODO Auto-generated method stub        
 Testnongfu t1=new Testnongfu();        
 TestHaizi  t2=new TestHaizi();        
 t1.start();        
 t2.start();    
 }}

3. 스레드 상태

Java의 기본 다시 얻기(18): 멀티스레딩 요약

4. 싱글턴 디자인 패턴

rree


위 내용은 Java 기초(18): 멀티스레딩으로 정리한 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.