マルチスレッドおよびマルチスレッドにおける様々な問題

12502 ワード

プロセスの概要とマルチプロセスの意義スレッドの概要とマルチスレッドの意義JVM運行原理及びJVM起動スレッド検討マルチスレッドスレッドスケジューリングスレッド制御の実現
プロセスの概要とマルチプロセスの意義
A:     
	     ,         ,             。
B:    
	      ?                   。
	  :           ,                 。
				                      。
C:      
	             。                 (    ),     (    ),
	                    。  :Windows,Mac Linux ,               。
	         ,                ?  。
	  CPU              ,                     ,       ,
	  ,              ,          。              ,    CPU    。

スレッドの概要とマルチスレッドの意義と並列と同時の違い
A:     
	                ,                   。     CPU     。  ,            ,    CPU       。
B:         ?
	              ,              。
	           ?
	          ,    CPU    (   ),         ,     
	CPU                       .      ,CPU      
	            ,            .          ,    
	          CPU    ,       ,          .
C:           :     。
	          ,                。
	          ,                。
       ?
          :               ,                ,                       ,   ,                          ,    "      ",       ,           ,          .      ,         ,        ,         ,         n      ..      .
       
       ?
        :               ,  :              ,            
        

Javaプログラムの運行原理とJVMの起動はマルチスレッドのですか
A:Java      
	Java     java   ,  JVM,           ,          。
	           “   ” ,             main   。
	   main         。
B:JVM         :		JVM                 ,       。

マルチスレッドプログラム実装方式1
A:       :
	             ,               。
  		          ,                   。
  		  Java            ,  ,               。
  		   ?Java     C/C++             。
  		 C/C++           ,   Java        ,
  		            。             。
	   Thread 
	B:          1
		a:  Thread 
		b:       
		c:     :
			            
			         
			run() start()     
           run  ,    start  .        ;
	 Java           run   。
     
           run  ?
         ,                      ?		
              ,                         ?    
        run                  .
   
 run           :           
 C:    :	          1		
 public class MyTest {
public static void main(String[] args) {
    MyRunnable myRunnable = new MyRunnable();
    Thread th = new Thread(myRunnable);
    th.start();
}
}
public class MyRunnable implements Runnable{
@Override
public void run() {
    //      
    for (int i = 0; i < 100; i++) {
        System.out.println(i);
    }
}
}

スレッドオブジェクト名の取得と設定
A:Thread           
	public final String getName()//      
	public final void setName(String name)//      
	                 
	  :
		    main          ?
		public static Thread currentThread()//         
		/**
	 *               ,               ,
	            ,         getName         .
	 *         ? public static Thread currentThread()                 。 
	 */

スレッドのスケジューリングとスレッドの優先度の設定
A:     
	             CPU,   CPU               ,
	       CPU   ,      ,       。  Java            ?
B:         :
	         	         CPU     ,           CPU     
	                       CPU,          ,         ,
					           CPU         。 
					Java           。
C:            
	public final int getPriority() //        
	public final void setPriority(int newPriority)//        
D:    :	          
    :                    ,                   ,      ?
-                     CPU        .               ,
-                   


                ,  java           ,                  .
              ,               .
         :	
	public final int getPriority()        。 
         5

        :
	public final void setPriority(int newPriority)

スレッド制御スリープスレッド
A:    :	public static void sleep(long millis)     
B:    :	    

public class MyRunnable implements Runnable {
static int piao = 10000;
static Object obj = new Object();
@Override
public void run() {
    while (true) {
        synchronized (obj) {
            if (piao >= 1) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "    " + (piao--) + "  ");
            }
        }  
    }
}
}

スレッド制御の追加スレッド
A:    :	public final void join()
	    :             ,          
	    :        ,     
B:    :	    
public class MyTest {
public static void main(String[] args) throws InterruptedException {
    MyThread th1 = new MyThread("  ");
    MyThread th2 = new MyThread("  ");
    MyThread th3 = new MyThread("  ");
    //     ,         
    //join()       ,   
    th1.start();
    th1.join();
    th2.start();
    th2.join();
    th3.start();
    th3.join();
    //  :         
}
}

スレッド制御の礼譲スレッド
A:    :	public static void yield():	             ,       。 
B:    :	    
       ,               ,         ,        .
      ?
                 ,            ,             ,        
   CPU    ,                     CPU    . 

スレッド制御のデーモンスレッド
A:    :	public final void setDaemon(boolean on):
	                。               ,Java      。 
	             。 
 Java         
1.            
                 ,   Java          dead ,      。               ,         ,      。    ,              ,         ,    ,       ,       。
    
 2.              
           dead     ,                   ,          ,   dead ,            , JVM     ,          ,              ,         ,               ,      、    、   。
    
 3.      
             setDaemon(true),         。
            1)thread.setDaemon(true)   thread.start()    。
            2) Daemon           Daemon 。
            3)             Daemon       ,            。
      Daemon Thread         ,          。
    
 4.Java     Linux    
            。Linux           ,     。
     Windows ,     javaw           , Unix   &         。             。

スレッド制御の割り込みスレッド
    
	public final void stop():		       
	public void interrupt():		    (       ),  API       wait(),sleep(long time)           ,            

マルチスレッドプログラム実装方式2
A:  Runnable                              
	a:        
	b:         
	c:         
		      Java         。
B:    :	          2
    MyRunnable myRunnable = new MyRunnable();
   // Runnable                          。
    //Thread(Runnable target)
    //     Thread   。
    Thread th = new Thread(myRunnable);
    th.start();
    public class MyRunnable implements Runnable{
@Override
public void run() {
    //      
    for (int i = 0; i < 100; i++) {
        System.out.println(i);
    }
}
}

マルチスレッドプログラム実装方式3
A:   Callable   。       Runnable      ,        ,        。
B:   Callable   ,   FutureTask       ,        。  FutureTask    Future       
C:    
	1.       Callable   
	2.    FutureTask  Callable              
	3.  Thread , FutureTask         
	4.    
	public class MyTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
    //       3
    MyCallable myCallable = new MyCallable();
    FutureTask task = new FutureTask<>(myCallable);
    Thread thread = new Thread(task);
    thread.start();
    //       ,      
    Integer integer = task.get();
    System.out.println(integer);
}
}
public class MyCallable implements Callable {
//call            
@Override
public Integer call() throws Exception {
    System.out.println("     ");
    int sum=0;
    for (int i = 1; i <= 100; i++) {
        sum+=i;
    }
    return sum;
}
}

Runnableインタフェースを実現する方法で映画の切符を売る
A:    
	  :              ,  100  ,   3       ,               。
	    Runnable    
	    public class MyTest {
public static void main(String[] args) {
    MyRunnable myRunnable1 = new MyRunnable();
    Thread th1 = new Thread(myRunnable1);
    Thread th2 = new Thread(myRunnable1);
    Thread th3 = new Thread(myRunnable1);
    th1.setName("  1");
    th2.setName("  2");
    th3.setName("  3");
    th1.start();
    th2.start();
    th3.start();
}
}

 public class MyRunnable implements Runnable{

static int piao = 100;
@Override
public void run() {

    while (true) {
        if (piao > 1) {
            String name = Thread.currentThread().getName();
            System.out.println(name + "    " + (piao--) + "  ");
        }
    }
}

映画の切符を買って同票と負数票が現れた原因の分析
A:    
	              ,           ,        ,
	             ,         ,  ,        ,         
	            ,      100  
B:       

スレッドセキュリティ問題の発生原因分析
A:          ?(              )
	        
	       
	             
B:            ?
	    :            。
	     ?
	                  ,                。
                    :
 a:         
 b:         
 c:                 

               ,          ,             ,             .
       a , b      ,       c   ,       ?                   
      ,              ,           ,                 ,    
      ,           ?
         :
  : 	
 synchronized(  ){//        new    new       
         ;
 }
                            
  	                           
                  
            .
            

同期コードブロックの方式はスレッドの安全問題と解釈と同期の特徴とメリットと弊害を解決する.
A:        
	  :
	synchronized(  ){
		       ;
	}
	                      。         
B:    :	                
C:    :	                    
D:     :	                。
E:     :	       ,                ,        ,             。
 java   ,        ,         synchronized    ,
    synchronized          ,              。
  java    :  java               ,        。
                        ,                 。
                               。
  java         ,                    ,
     A       B       ,  A        ,
      B     ,  B        ,  A         。
  java       :java                        ,
    ,             ,            ,          ,
                   class    。
      ,            ,         class  ,
                    ,           。
             ,              ,        ,
                            .

JDK 5以降のロックの概要と使用
A:Lock    
	                        ,
	                  ,       ,
	                ,JDK5            Lock
B:Lock ReentrantLock
	void lock()
	void unlock()
C:    :	Lock    
public class MyRunnable implements Runnable {
static int piao = 100;
static Object obj = new Object();
static ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
    while (true) {
        //  
        try {
            lock.lock();
            if (piao >= 1) {
                try {
                    Thread.sleep(20);//       th1
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "    " + (piao--) + "  ");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //       
            //   
            lock.unlock();
        }
    }
}
}

デッドロックの問題の概要と使用
A:      
	         ,         
	                    ,                
	          
	   :            ,   CPU       ,       
	   :	           
 		        
 		         
		            
	                  
B:    :	        
 package com.xupt.hh;
 public class test3 {
public static void main(String[] args) {
    run run = new run(true);
    run run1 = new run(false);
    run.start();
    run1.start();
}
}
class run extends Thread {
boolean flag;
public run(boolean flag) {
    this.flag = flag;
}
@Override
public void run() {
    if (flag) {
        synchronized (obj.obj1) {
            System.out.println("true====Obj1    ");
            synchronized (obj.OBJ2) {
                System.out.println("true====Obj2   ");
            }
        } 
    } else {
        synchronized (obj.OBJ2) {
            System.out.println("false====Obj2    ");
            synchronized (obj.obj1) {
                System.out.println("false====Obj1    ");
            }
        }
    }
}
public interface obj {
    public static final Object obj1 = new Object();
    Object OBJ2 = new Object();
}

}