java多线程基本概述(十四)——Thread内部类的几种写法

import java.util.concurrent.TimeUnit;

//命名匿名类-Thread
class InnerThread1 {
    private int countDown = 5;
    private Inner inner;
    private class Inner extends Thread{
        Inner(String name){
            super(name);
            start();
        }

        @Override
        public void run() {
            try {
                while (true){
                    System.out.println(this);
                    if(--countDown==0)
                        return;
                    sleep(10);
                }
            }catch (InterruptedException e){
                System.out.println("interrupted");
            }
        }

        @Override
        public String toString() {
            return getName()+": "+countDown;
        }
    }

    public InnerThread1(String name){
        inner = new Inner(name);
    }
}


//命名内部类-Runnable
class InnerRunnable1 {
    private int countDown = 5;
    private Inner inner;
    private class Inner implements Runnable{
        Thread t;
        Inner(String name){
            t = new Thread(this, name);
            t.start();
        }

        @Override
        public void run() {
            try {
                while (true){
                    System.out.println(this);
                    if(--countDown==0) return;
                    TimeUnit.SECONDS.sleep(10);
                }
            }catch (InterruptedException e){
                System.out.println("interrupted");
            }
        }

        @Override
        public String toString() {
            return t.getName()+": "+countDown;
        }
    }

    public InnerRunnable1(String name){
        inner = new Inner(name);
    }
}

//匿名内部类-Thread
class InnerThread2 {
    private int countDown = 5;
    public InnerThread2(final String name){
          new Thread(name){
              @Override
              public void run() {
                  try {
                      while (true){
                          System.out.println(this);
                          if(--countDown==0)
                              return;
                          sleep(10);
                      }
                  }catch (InterruptedException e){
                      System.out.println("interrupted");
                  }
              }

              @Override
              public String toString() {
                  return getName()+": "+countDown;
              }
          }.start();
    }
}

//匿名内部类-Runnable2
class InnerRunnable2 {
    private int countDown = 5;
    public InnerRunnable2(final String name){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    while (true){
                        System.out.println(this);
                        if(--countDown==0)
                            return;
                        TimeUnit.SECONDS.sleep(10);
                    }
                }catch (InterruptedException e){
                    System.out.println("interrupted");
                }
            }

            @Override
            public String toString() {
                return Thread.currentThread().getName()+": "+countDown;
            }
        }, name).start();
    }
}

//a separate methid to run somoe code as task
class ThreadMethod{
    private int countDown = 5;
    private Thread thread;
    private String name;

    public ThreadMethod(String name) {
        this.name = name;
    }

    public void runTask(){
        if (null==thread){
            new Thread(name){
                @Override
                public void run() {
                    try {
                        while (true){
                            System.out.println(this+"");
                            if(--countDown==0) return;
                            sleep(10);
                        }
                    }catch (InterruptedException e){
                        System.out.println("interrupted");
                    }
                }

                @Override
                public String toString() {
                    return Thread.currentThread().getName()+": "+countDown;
                }
            }.start();
        }
    }
}

public class Test2{
    public static void main(String[] args) {
            new InnerThread1("InnerThread1");
            new InnerRunnable1("InnerRunnable1");
            new InnerThread2("InnerThread2");
            new InnerRunnable2("InnerRunnable2");
            new ThreadMethod("ThreadMethod");
    }
}

输出结果:

InnerThread1: 5
InnerThread2: 5
InnerRunnable1: 5
InnerRunnable2: 5
InnerThread1: 4
InnerThread2: 4
InnerThread2: 3
InnerThread1: 3
InnerThread1: 2
InnerThread2: 2
InnerThread1: 1
InnerThread2: 1
InnerRunnable1: 4
InnerRunnable2: 4
InnerRunnable1: 3
InnerRunnable2: 3
InnerRunnable2: 2
InnerRunnable1: 2
InnerRunnable2: 1
InnerRunnable1: 1

Process finished with exit code 0

 

posted @ 2017-04-19 17:50  soar_hu  阅读(1182)  评论(0编辑  收藏  举报