1.继承Thread类:
继承Thread类并重写run()方法,然后新建一个Thread实例调用实例的start()方法即可,start()将自动调用run()方法.但是java只能单继承,如果继承了Thread类就不能继承其他的类了.
public class TestThread3 extends Thread{ @Override // 重写run方法 public void run() { System.out.println("run运行了"); } public static void main(String[] args) { TestThread3 thread = new TestThread3(); thread.start(); } }
2.实现Runnable接口:
实现Runnable接口,然后实现run()方法,接着新建Thread实例并把Runnable实现类传给Thread实例最后调用实例的start方法即可.java是单继承多实现,相比继承Thread类,就可以继承其他的类和实现其他的接口.
Thread thread = new Thread(new Runnable() { @Override // 重写run方法 public void run() { System.out.println("run运行了"); } }); thread.start();
3.实现Callable接口
实现Callable接口,可以用来创建返回结果的线程,首先实现Callable接口,然后重写call方法,接下来用FutureTask包装Callable实现类,最后用Thread实例包装FutureTask,调用Thread实例的start方法即可
public class TestThreadCallable implements Callable{ public static void main(String[] args) { TestThreadCallable callable = new TestThreadCallable(); FutureTask<Object> task = new FutureTask<>(callable); new Thread(task).start(); try { Object result = task.get(); System.out.println(result); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } @Override // 重写call方法 public Object call() throws Exception { return "我是call方法的返回值"; } }
4.用线程池创建
线程池可有效管理线程,减少系统资源消耗,可以实现一定程度负载均衡,确保系统稳定性.首先通过ThreadPoolExecutor来构建一个线程池,然后使用execute方法来分配线程运行任务,最后使用shutdown来关闭线程池
public class TestThreadPoor { private static ThreadPoolExecutor executor; // 自定义线程池 static { executor = new ThreadPoolExecutor( // 线程池核心数量 10, // 最大线程池数量 10, // 最大空闲时间 1, // 时间单位 TimeUnit.MINUTES, // 工作队列 new LinkedBlockingQueue<>(100), // 线程工厂 Executors.defaultThreadFactory(), // 拒绝策略 new ThreadPoolExecutor.AbortPolicy() ); } public static void main(String[] args) { executor.execute(new Runnable() { @Override public void run() { System.out.println("线程池的任务"); } }); executor.shutdown(); } }