public class ThreadDemo {
//定义一个线程池对象
private static ExecutorService service=Executors.newFixedThreadPool(5);
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("main方法执行");
ThreadDemoSon01 son=new ThreadDemoSon01();
son.start();
ThreadDemoSon02 threadDemoSon02 = new ThreadDemoSon02();
Thread thread = new Thread(threadDemoSon02);
thread.start();
/* new Thread(()->{
}).start();*/
//通过callable接口来实现 futureTask 实际是runnable接口
FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyCallable());
Thread t3 = new Thread(futureTask);
t3.start();
Integer result = futureTask.get();
System.out.println("result"+result);
//我们可以通过线程池对象获取对应的线程
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("当前线程"+Thread.currentThread().getName());
}
});
//通过上面的 我们发现获取线程的方式有以下几种
/**
* 1 继承Thread对象
* 2 实现runnable接口
* 3 实现callable接口
* 4 定义线程池
*
* 继承Thread对象和实现runnable接口是没有办法获取返回结果的
* callable 可以回去线程的返回结果
* 但是这三种方法都不能控制我们得资源 如果线程过多 不能灵活的去控制
* 线程池可以控制资源
*/
System.out.println("main方法结束");
}
}
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("当前线程"+Thread.currentThread().getName());
return 10;
}
}
class ThreadDemoSon01 extends Thread{
@Override
public void run() {
System.out.println("当前线程"+Thread.currentThread().getName());
}
}
class ThreadDemoSon02 implements Runnable{
@Override
public void run() {
System.out.println("当前线程"+Thread.currentThread().getName());
}
}