1.继承Thread创建线程
// 实现线程有三种方法,第一种
public class TheadDemo extends Thread{
@Override
public void run() {
System.out.println("实现线程的第一种方式");
}
public static void main(String[] args) {
// 实例化
TheadDemo td = new TheadDemo();
// 第一个线程
Thread thread = new Thread(td);
// 启动线程
thread.start();
// 第二个线程
Thread thread1 = new Thread(td);
thread1.start();
}
}
2.实现Runnable接口
//实现线程的第二种方式 public class RunnableDemo implements Runnable{ @Override public void run() { System.out.println("实现线程的第二种方式"); } public static void main(String[] args) { // 实例化当前线程 RunnableDemo rd = new RunnableDemo(); // 第一个线程 Thread thread = new Thread(rd); //开启线程 thread.start(); // 第二个线程 Thread thread1 = new Thread(rd); thread1.start(); } }
2.2 介于实现Runnable接口与继承Thread创建线程(便于偷懒)
//介于继承实现线程和实现接口实现线程之间 public class Demo2_2 { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println("介于继承实现线程和实现接口实现线程之间"); } }).start(); } }
3.实现Callable接口创建线程(过于繁杂)
// 第三种实现线程方式 //Callable<>泛型用于约束,尖括号里是什么类型即重写方法的类型 public class CallableDemo implements Callable<Integer> { @Override public Integer call() throws Exception { int i = 0; for (;i<20;i++){ // 获得当前线程(Thread.currentThread())的名字(getName()) System.out.println(Thread.currentThread().getName()+"\t"+i); } return i; } public static void main(String[] args) { // 实例化 CallableDemo cd = new CallableDemo(); // 做一个任务 FutureTask<Integer> ift = new FutureTask<>(cd); // 线程池 ExecutorService es = Executors.newFixedThreadPool(2); //2代表两个线程 // ExecutorService追踪任务,即es追踪ift es.submit(ift); try { // ift.get()得到追踪的内容 Integer result = ift.get(); System.out.println( result); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } // 关闭 es.shutdown(); } }