欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现多线程的方式

程序员文章站 2022-06-08 23:24:14
...

1.继承Thread类

public class Demo extends Thread {
  public void run() {
    try {
      System.out.println("thread");
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

public static void main(String[] args) {
    new Demo().start();
}

 

2.实现Runnable接口

public class Demo implements Runnable{
    public void run() {
        try {
      System.out.println("runnable");
      } catch(Exception e) {
      e.printStackTrace();
          }
    }
}

public static void main(String[] args) {
    new Thread(new Demo()).start();
}

 

3.实现Callable接口

与Runnable相比,Callable功能更强大,可以返回值,可以跑出异常,支持泛型的返回值。

需要借助FutureTask类获取返回结果,Future接口可以对Runnable、Callable任务执行结果进行取消、查询是否完成、获取结果等。

FutureTask是Future接口的唯一实现类,FutureTask同时实现了Funnable和Future接口,既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。

public class Demo implements Callable<String>{
    public String call() throws Exception {
        System.out.println("callable");
        return "success";
    }
}

public static void main(String[] args) throws Exception {
    Callable<String> demo=new Demo();
    FutureTask<Strign> task=new FutureTask<>(demo);
    new Thread(task).start();
    System.out.println("线程返回值:"+task.get());
} 

 

4.使用线程池

提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。

提高响应速度,降低资源消耗,便于线程管理。

public static void main(String[] args) throws Exception {
    ExecutorService pool=Executors.newFixedThreadPool(5);
    List<Future> list=new ArrayList<>();
    for(int i=0;i<5;i++) {
        Callable<String> c=new Demo();
        Future f=pool.submit(c);
        list.add(f);
    }
    pool.shutdown();
    for(Future f:list) {
        System.out.println("线程返回值"+f.get());
    }
}

 

上一篇: JSP 标签

下一篇: java数据流