다선정에 대한 사고

6236 단어
다중 스레드의 의미
  • 다핵 기계의 성능을 충분히 이용하고 만약에 단핵 시스템에서 운행한다면 다선정은 시간편의 개념을 이용하여 실현된 가짜 다선정일 뿐이다.
  • 차단 방지
  • 다중 스레드 생성
    1.   Thread 
    public class myThread_1 extends Thread{
        @Override
        public void run(){
            System.out.println("My thread is running");
        }
    
        public void createThread_1(){
            Thread thread = new Thread();
            thread.start();
        }
    
        public void createThread_1_1(){
            Thread thread = new Thread(){
                @Override
                public void run(){
                    System.out.println("Thread Running");
                }
            };
            thread.start();
        }
    }
    
    2.  Runnable  
    public class myThread_2 implements Runnable {
    
        @Override
        public void run() {
            System.out.println("MyRunnable running");
        }
    
        public void createMyThread_2(){
            Thread thread = new Thread(new myThread_2());
            thread.start();
        }
    
        public void createMyThread_2_1(){
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("MyRunnable running");
                }
            };
            Thread thread = new Thread(runnable);
            thread.start();
        }
    }
    
    3.   Callable  
    public class myThread_3{
        public void createCallableThread_3 (){
            Callable callable = new Callable() {
                @Override
                public Integer call() throws Exception {
                    return new Random().nextInt(100);
                }
            };
    
            FutureTask future = new FutureTask(callable);
            new Thread(future).start();
            try {
                Thread.sleep(5000);
                System.out.println(future.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
    

    Runnable() 및 Callable() 방법
  • Runnable에서 실현된run() 방법은 값을 되돌려주지 않고 단순히run의 코드를 실행합니다.2. Callable는 스레드 실행 상태와 진행 상황을 가져옵니다.Future와의 공동 사용을 통해 다중 스레드의 운행 결과를 얻을 수 있고 일부 조작을 할 수 있다.

  • 어떻게 스레드 간의 통신을 다중 스레드에서 실현할 것인가는 불가피하게 스레드 간의 통신을 통해 완성해야 한다.여기에 언급된 개념은:thread.join(), object.wait(), object.notify (), CountdownLatch, CyclicBarrier,FutureTask,Callable 예를 들어 어떻게 두 라인을 순서대로 실행합니까?우리는thread를 사용할 수 있다.join().
        public void demo_join(){
             final Thread A = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("A is running");
                }
            });
    
            Thread B = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("B is waiting A");
                    try {
                        A.join();
                    }catch(InterruptedException e){
                        e.printStackTrace();
                    }
                    System.out.println("B is running");
                }
            });
    
            B.start();
            A.start();
        }
    

    그러면 어떻게 두 노선을 지정된 방식에 따라 질서정연하게 교차 운행하게 합니까?
    public void demo_notify(){
            final Object lock = new Object();
            Thread A = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized(lock){
                        System.out.println("A-1");
                        try{
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("A-2");
                    }
                }
            });
    
            Thread B = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized(lock){
                        System.out.println("B-1");
                        lock.notify();
                        System.out.println("B-2");
                    }
                }
            });
    
            A.start();
            B.start();
        }
    

    4개의 스레드 A B C D, 그 중에서 D는 A B C가 모두 실행된 후에야 실행되고 A B C는 동기화되어 실행된다.
    public void demo_countDownlatch(){
            int worker = 3;
            final CountDownLatch countDownLatch = new CountDownLatch(worker);
            new Thread(new Runnable() {
                @Override
                public void run() {
                System.out.println("D is waiting for other three threads");
                    try {
                        countDownLatch.await();
                        System.out.println("D is running");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
            for (char threadName='A'; threadName <= 'C'; threadName++) {
                final String tN = String.valueOf(threadName);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(tN + "is working");
                        try {
                            Thread.sleep(100);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        System.out.println(tN + "finished");
                        countDownLatch.countDown();
                    }
                }).start();
            }
        }
    

    세 선수는 각자 준비를 하고, 세 사람이 모두 준비가 다 된 후에 함께 뛴다.
        public void demo_CyclicBarrier(){
            int runner = 3;
            final CyclicBarrier cyclicBarrier = new CyclicBarrier(runner);
    
            for(char name='A';name<='C';name++){
                final String name_temp = String.valueOf(name);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            cyclicBarrier.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (BrokenBarrierException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }
    

    좋은 웹페이지 즐겨찾기