实现Runnable接口
耦合度低,面向接口编程
/**
* 实现接口,重写方法,创建Thread对象,创建类对象start()方法启动
*/
public class Test implements Runnable {
@Override
public void run() {
System.out.println("创建线程的第一种方式");
}
public static void main(String[] args) {
Test test = new Test();
Thread thread = new Thread(test);
thread.start();
}
}
创建线程方式二----继承Thread
/**
* 实现Thread类
*/
public class Test extends Thread {
@Override
public void run() {
System.out.println("创建线程的第二种方式");
}
public static void main(String[] args) {
Test test = new Test();
Thread thread = new Thread(test);
thread.start();
}
}
创建具有返回值的线程
需要用到对象的api xxx.get()获取返回值,类型自己定义
public class Test {
public static void main(String[] args) {
/** 使用Lambda表达式创建Callable对象 */
FutureTask<Integer> task = new FutureTask<Integer>(
(Callable<Integer>)()->{
return 6666;
}
);
/** 实质上还是以Callable对象来创建并启动线程 */
new Thread(task,"有返回值的线程").start();
try {
System.out.println(task.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用线程池的方式
public class Test {
public static void main(String[] args) {
// ExecutorService executorService = Executors.newCachedThreadPool(); //具有缓存的线程池
// ExecutorService executorService = Executors.newSingleThreadExecutor(); //单个线程池
ExecutorService executorService = Executors.newFixedThreadPool(5); //固定大小的线程池
executorService.execute(new TestRunnable());
executorService.shutdown();
}
}
class TestRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程被调用了。");
}
}