如何通过使用匿名内部类来将线程代码隐藏在类中
2016-05-17 21:41
357 查看
/*有时候通过使用内部类来讲线程代码隐藏在类中会很有用*/ // 使用一个私有的内部类。 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
相关文章推荐
- LeetCode Reverse Words in a String
- Ubuntu下启动Eclipse报错:A Java RunTime Environment (JRE) or Java Development Kit (JDK) must
- MATLAB中的矩阵建立
- java之判断输入的字符类型个数
- C++实现委托机制(三)——lambda表达式封装
- C++的头文件和实现文件分别写什么
- 【Struts2】:自定义Interceptor
- C++深层复制构造函数
- 论飞机游戏在C语言程序的基本语句能完成功能的体会
- JDK1.8源码中的设计模式
- 框架 day30 Struts2练习项目-人员管理(增删改查)
- LeetCode Evaluate Reverse Polish Notation
- C语言中memset函数详解
- 核心编程(第十章)嵌套函数,装饰器
- web编程的一些概念
- 面向接口编程以及面向接口编程的好处
- Spring解析
- Spring的IOC的解析
- python笔记之ArcPy简介
- C#Winform判断文件和路径是否存在