创建线程有哪几种方式
方法一,直接使用Thread
//创建线程对象
Thread t=new Thread(){public void run(){//要执行的任务}
}
例如:
//构造方法的参数是给线程制定名字,推荐
Thread t1=new Thread(){@Override//从run方法内实现了要执行的任务public void run(){System.out.println("running------"");}
}
t1.start9);
方法二:使用Runnable配合Thread
把【线程】和【任务】(要执行的代码)分开
*Thread代表线程
*Runnable可运行的任务(线程要执行的代码)
Runnable runnable=new Runnable(){public void run(){//要执行的任务}
}
//创建线程对象
Thread t=new Thread(runnbale);
//启动线程
t.start();
例如
//创建任务对象
Runnable runnable=new Runnable(){@Overridepublic void run(){System.out.println("running------");}
}
//参数1是任务对象;参数2是线程名字是,推荐
Thread t2=new Thread(runnbale,"t2");
//启动线程
t2.start();
Java8以后可以使用lambda精简代码
//创建任务对象
Runnable task2=()-> {
System.out.println("running------");
{System.out.println("test------")
};
//参数1是任务对象;参数2是线程名字是,推荐
Thread t2=new Thread(runnbale,"t2");
//启动线程
t2.start();
Runnable接口,重写Thread的run方法
Thread与Runnbale的关系
(1)方法1是吧线程和任务合并在了一起,方法2是把线程和任务分来了
(2)用Runnable更容易与线程池等高级API配合
(3)用Runnable让任务类脱离了Thread继承体系,更灵活
方法3,FutureTask配合Thread
FutureTask能够接收Callable类型的参数我,用来处理有返回结果的情况
FutureTask<Integer> task3=new FutureTask(()->{System.out.println("running------");return 100;
});//参数1是任务对象,,参数2是线程名字,推荐
new Thread(task3,"t3").start();//主线程阻塞,同步等待task执行完毕的结果
Integer result=task3.get();
System.out.println("返回结果是:"+result);
Callable接口是一个有返回结果的接口,里面有个call()方法
FutureTask<Integer> task3=new FutureTask(new Callable<Integer>()->{public Integer call() throws Exception{System.out.println("running------");Thread.sleep(2000);return 100;}
});new Thread(task3,"t3").start();Integer result=task3.get();
System.out.println("返回结果是:"+result);