マルチスレッドおよびいくつかの起動スレッドの方法


マルチスレッド
  • プロセスおよびスレッド
  • マルチスレッド
  • マルチスレッドの起動方式
  • 方式一
  • 方式二
  • 方式三
  • 方式四
  • プロセスとスレッド
    プロセスとスレッド:
    ≪プロセス|Process|emdw≫:実行中のプログラム.スレッド:独立した実行パス.1つのプロセスには1つのスレッドしかないか、複数のスレッドがあるかのいずれかです.
    マルチスレッド
    Javaには、プライマリ・スレッドとゴミ回収スレッドの少なくとも2つのスレッドがあります.
    マルチスレッドを開くと効率が低下するが,cpuの使用率が向上し,cpuの使用率が合理的に利用される.
    マルチスレッド:特定の機能を完了する実行パスを有し、CPUが最初に実行する単位である.CPUは,ある時間スケールで1スレッドの1つの原子文しか実行できない.
    CPU実行原理:
    1.実際の環境では、CPUは複数のプログラムを同時に実行することができ、本質は同じ時間スケールで1つのスレッドの原子文を実行するだけである.ただしCPU切替の実行速度は非常に速く,同時実行であるとは気づかなかった.
    2.同時および並列:同時:同じ期間に同時に実行されます.パラレル:同じ時間スケールで同時に実行されます.
    3.同期と非同期:同期:同時発生の場合、同期の問題が発生する.非同期:同じ期間に複数のタスクを処理できます.
    マルチスレッドを開くメリット:
    1.時間のかかるタスクを実行します.
    2.同僚が実行しているように見えるプログラムがあることを望んでいます.
    3.特定のサブタスクを完了します.
    4.スレッドのブロックを防ぐ.
    マルチスレッドの起動方法
    方式一
    方式一:Threadクラスを継承する1.カスタムクラスMyThreadはThreadクラスを継承する
    2.MyThreadクラスはrunメソッドを書き換えます.
    3.スレッドオブジェクトの作成
    public class ThreadSeatwork1 {
      public static void main(String[] args) {
     //		      
    	MyThread mt = new MyThread(new File("ThreadSeatwork1.java"), new File("thread.txt"));
    	mt.start();
    }
    }
    
    //1.    MyThread  Thread 
    
    class MyThread extends Thread{
    
    private File srcFile;
    private File descFile;
    	
    public MyThread() {
    	super();
    }
    public MyThread(File srcFile, File descFile) {
    	super();
    	this.srcFile = srcFile;
    	this.descFile = descFile;
    }
    // 2.MyThread   run  。
    @Override
    public void run() {
    	copyFile(srcFile, descFile);
    }
    
    public void copyFile(File sreFile, File descFile) {
    	try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
    			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(descFile));){
    		int len = 0;
    		byte[] bys = new byte[1024];
    		while ((len = bis.read(bys)) != -1) {
    			bos.write(bys, 0, len);
    			bos.flush();
    		}
    		
    	} catch (FileNotFoundException e) {			
    		e.printStackTrace();
    	} catch (IOException e1) {			
    		e1.printStackTrace();
    	}
    }
    public File getSrcFile() {
    	return srcFile;
    }
    
    public void setSrcFile(File srcFile) {
    	this.srcFile = srcFile;
    }
    
    public File getDescFile() {
    	return descFile;
    }
    
    public void setDescFile(File descFile) {
    	this.descFile = descFile;
    }
    

    }
    注意:
    1.起動スレッドはrun()メソッドではなくstart()メソッドを使用します.
    2.スレッドは複数回起動できない
    方式2
    方式二:Runnableインタフェースを実現する
    1.カスタムクラスMyRunnable実装Runnableインタフェース
    2.run()の書き換え方法
    3.MyRunnableクラスのオブジェクトの作成
    4.Threadクラスのオブジェクトを作成し、ステップ3で作成したオブジェクトを構築パラメータとして渡す
    5.スレッドの開始
    インタフェース方式を実現するメリット:
    Javaシングル継承による限界を回避
    複数の同じプログラムに適したコードが同じリソースを処理する場合、スレッドとプログラムのコード、データを有効に分離し、
    オブジェクト向けの設計思想をよく体現している.
    public class ThreadSeatwork2 {
    public static void main(String[] args) {
    	MyRunnable mr = new MyRunnable();
    	Thread t = new Thread(mr);
    	t.start();
    	for (int i = 0; i < 100; i++) {
    		System.out.println("   " + i);
    	}		
      }
    }
    
    class MyRunnable implements Runnable {
    
    @Override
    public void run() {
    	for (int i = 0; i < 100; i++) {
    		System.out.println("   " + i);
    	}		
      }  	
    }
    

    方程式3
    Callable方式オープンスレッドFutureTask public class FutureTask Implements RunnableFuture{}を実現
    public interface RunnableFuture extends Runnable, Future{ void run(); }
    public interface Future { V get() throws InterrptedException, ExecutionException; }
    実装Runnableと実装Callableインタフェースの違い1.戻り値がある
    2.例外を宣言できます.ここでの戻り値と例外投げ出しは、スレッドの開始者に与えられます.
    public class ThreadSeatwork3 {
    public static void main(String[] args) {
    	FutureTask task = new FutureTask<>(new MyCallable(1, 100));
    	Thread t = new Thread(task);
    	t.start();
    	
    	for (int i = 0; i < 100; i++) {
    		System.out.println("main" + i);
    	}
    	try {
    		Integer value = task.get();
    		System.out.println(value);
    	} catch (InterruptedException | ExecutionException e) {
    		System.out.println("           " + e);
    		e.printStackTrace();
    	}
    	System.out.println("over");
      }
    }
    
    class MyCallable implements Callable {
    private Integer m;
    private Integer n;
    	
    public MyCallable() {
    	super();
    }
    public MyCallable(Integer m, Integer n) {
    	super();
    	this.m = m;
    	this.n = n;
    }
    
    
    @Override
    public Integer call() throws Exception {
    	int sum = 0;
    	for (int i = 0; i < 100; i++) {
    		System.out.println(i);
    		sum += i;
    	}
    	return sum;
    }
    
    public Integer getM() {
    	return m;
    }
    
    public void setM(Integer m) {
    	this.m = m;
    }
    
    public Integer getN() {
    	return n;
    }
    
    public void setN(Integer n) {
    	this.n = n;
      } 	
    }
    

    方式四
    方法4:匿名内部クラスがマルチスレッドを開く
    public class ThreadSeatwork4 {
    public static void main(String[] args) {
    	new Thread();
    	new Thread().start();
    //		     Thread    
    	new Thread() {}.start();
    	new Thread() {
    		public void run() {
    			for (int i = 0; i < 100; i++) {
    				System.out.println("     Thread    " + i);
    			}
    		}; 
    	}.start();
    	
    	new Thread(new Runnable() {
    		
    		@Override
    		public void run() {
    			for (int i = 0; i < 100; i++) {
    				System.out.println("     Runnable    " + i);
    			}				
    		}
    	}).start();
    	
    	for (int i = 0; i < 100; i++) {
    		System.out.println("       " + i);
    	}
    	
    //		          Thread,     Runnable  ,    Thread  
    	new Thread(new Runnable() {
    		
    		@Override
    		public void run() {
    			for (int i = 0; i < 100; i++) {
    				System.out.println("     Runnable    ---" + i);
    			}								
    		}
    	}) {
    		@Override
    		public void run() {
    			for (int i = 0; i < 100; i++) {
    				System.out.println("     Thread    ---" + i);
    			}
    			super.run();
    		}
    	}.start();
      }
    }