/*有时候通过使用内部类来讲线程代码隐藏在类中会很有用*/ // 使用一个私有的内部类。 class InnerThread1{ private int countDown=5; private Inner inner; private class Inner extends Thread{ // 在这里可能会造成this逃逸的问题。但是由于这里比较简单,所以不会造成这个问题。 Inner(String name) { super(name); start();//直接使用继承的方法。 } @Override public void run() { while (true) { System.out.println(this); if (--countDown == 0) { return; } try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } public String toString() { return getName() + ": "+countDown; } } public InnerThread1(String name) { inner = new Inner(name);//创建这个内部类的一个实例。 } } //在构造器中创建一个内部类。 class InnerThread2{ private int countDown=5; private Thread t; //使用匿名内部类来进行创建。 public InnerThread2(String name) { t = new Thread(name){ @Override public void run() { super.run(); while (true) { System.out.println(this); if (--countDown == 0) { return; } try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } public String toString() { return getName() + ": "+countDown; } }; t.start(); } } //通过实现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);//name指代的是线程的名称。 t.start(); } @Override public void run() { while (true) { System.out.println(this); if (--countDown == 0) { return; } try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } public String toString() { return t.getName() + ": "+countDown; } } public InnerRunnable1(String name) { inner = new Inner(name); } } //在类的构造器中实现Runnable接口的线程。 class InnerRunnable2{ private int countDown=5; private Thread t; public InnerRunnable2(String name) { t = new Thread(new Runnable() { @Override public void run() { while (true) { System.out.println(this); if (--countDown == 0) { return; } try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } //重写这个方法。 public String toString(){ return Thread.currentThread().getName()+": "+countDown; } }, name); t.start(); } } //在一个方法中实现一个线程的内部类。这个可能相对来说是比较常用的。 class ThreadMethod{ private int countDown=5; private Thread t; private String name; public ThreadMethod(String name) { this.name = name; } public void runTask() { if (t == null) { t = new Thread(name){ @Override public void run() { while (true) { System.out.println(this); if (--countDown == 0) { return; } try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } public String toString(){ return getName()+": "+countDown; } }; t.start(); } } } public class ThreadVariations { public static void main(String[] args) { new InnerThread1("InnerThread1"); new InnerThread2("InnerThread2"); new InnerRunnable1("InnerRunnable1"); new InnerRunnable2("InnerRunnable2"); new ThreadMethod("ThreadMethod").runTask(); }}
程序运行的结果如下:
InnerThread1: 5 InnerThread2: 5 InnerRunnable1: 5 InnerRunnable2: 5 ThreadMethod: 5 InnerThread2: 4 InnerThread1: 4 InnerRunnable1: 4 InnerRunnable2: 4 ThreadMethod: 4 InnerThread1: 3 InnerThread2: 3 InnerRunnable1: 3 InnerRunnable2: 3 ThreadMethod: 3 InnerThread2: 2 InnerThread1: 2 InnerRunnable1: 2 InnerRunnable2: 2 ThreadMethod: 2 InnerThread2: 1 InnerThread1: 1 InnerRunnable1: 1 InnerRunnable2: 1 ThreadMethod: 1
如何通过使用匿名内部类来将线程代码隐藏在类中
最新推荐文章于 2021-03-05 10:12:06 发布