有些方法需要传入接口的实例或者抽象类的实例对象,比如Thread有一个构造方法,Thread(Runnable target)
这时可以可以自定义类实现Runnable接口,重写接口中的方法,将自定义类的对象传入构造方法中
也可以使用匿名内部类,即在创建Thread对象时传入Runnable接口,在其后面重写接口的方法
这篇文章介绍下使用匿名内部类创建三个线程
package createThreads;
import java.util.concurrent.*;
public class anoymousThreadTest01 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//使用匿名内部类创建Thread对象,1
new Thread(){
@Override
public void run() {
System.out.println("hello world 1");
}
}.start();
//2
Thread t1=new Thread(){
@Override
public void run() {
System.out.println( "hello world 2");
}
};
t1.start();
//使用匿名内部类创建Runnable接口实例,创建线程1
new Thread(new Runnable() {
@Override
public void run() {
System.out.println( "你好,世界 2");
}
}).start();
//2
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
System.out.println( "你好,世界 2");
}
});
t2.start();
//使用匿名内部类创建Callable接口实例,创建线程
ExecutorService es= Executors.newFixedThreadPool(2);//创建线程池
Future<Integer> f=es.submit(new Callable<Integer>() { //创建Callable接口实例,重写call方法,放入线程池
@Override
public Integer call() {
return 3*5;
}
});
System.out.println( f.get()); //输出返回的结果
es.shutdown(); //关闭线程池
}
}
out:
你好,世界 2
hello world 1
你好,世界 2
hello world 2
15
获取名字和设置名字的三种方式,以Thread为例,获取当前线程对象可以试用Thread类的静态方法currentThread()
public class anoymousThreadTest02 {
public static void main(String[] args){
//设置线程名字,1利用Thread类的setName方法
Thread t1=new Thread(){
@Override
public void run() {
System.out.println( "线程t1的名字是: "+this.getName());
}
};
t1.setName("线程t1");
//2,在Thread类的构造方法中传入名字
Thread t2=new Thread("线程t2"){
@Override
public void run() {
System.out.println( "线程t2的名字是: "+getName());
}
};
//3,在run方法体中使用Thread类的setName方法
Thread t3=new Thread(){
@Override
public void run() {
this.setName("线程t3");
System.out.println( "线程t3的名字是: "+this.getName());
}
};
t3.start();
t1.start();
t2.start();
// 获取当前线程对象,利用Thread中的currentThread方法
//Runnable接口中的run方法无法直接利用getName方法,可先获取当前对象,再利用Thread类的getName方法获取当前线程名字
Thread t4=new Thread(new Runnable() {
@Override
public void run() {
System.out.println( "线程t4的名字是: "+Thread.currentThread().getName());
}
},"线程t4");
t4.start();
//不设置线程名字,系统会默认为线程命名
Thread t5=new Thread(){
@Override
public void run() {
System.out.println( "线程t5的名字是: "+getName());
}
};
t5.start();
//设置main方法的线程名字并打印
Thread.currentThread().setName("main方法");
System.out.println( "main方法的线程名字是: "+Thread.currentThread().getName());
}
}