首页 > 编程语言 > 详细

Java并发编程

时间:2020-01-10 20:59:21      阅读:71      评论:0      收藏:0      [点我收藏+]

技术分享图片

1、Java线程的创建方式

  常见的Java线程的4种创建方式:

  • 继承Thread类
  • 实现Runnable
  • 通过ExecutorService和Callable<Class>实现由返回值的线程
  • 基于线程池

1.1 继承Thread类

  Thread类实现Runnable接口并定义了操作线程的一些方法,可以通过继承thread类的方式创建一个线程。

具体代码如下:

(1)通过继承thread类创建NewThread线程:

public class NewThread extends Thread {
    public void run(){
        //具体业务逻辑实现
        System.out.println("创建一个新线程");
    }
}

(2)实例化Newthread并启动:

public class Main {
    public static void main(String[] args) {
        NewThread newThread = new NewThread();
        newThread.start();
    }
}

1.2 实现Runnable接口

  创建一个线程,最简单的方法是创建一个实现 Runnable 接口的类。为了实现 Runnable,一个类只需要执行一个方法调用 run()。

具体代码如下:

(1)通过实现Runnable接口的方式创建MyRunnable线程:

public class MyRunnable implements Runnable{
    public void run() {
        System.out.println("通过Runnable创建一个线程");
    }
}

(2)实例化MyRunnable对象,并创建一个线程对象传入已经实例化MyRunnable实例:

public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

1.3 通过ExecutorService和Callable<Class>实现有返回值的线程

  在主线程中开启多个线程并发执行一个任务,收集各个线程执行返回的结果并将最终结果汇总起来,就应该使用Callable接口。

具体代码如下:

(1)通过Callable接口创建MyCallable线程:

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    private String name;
    public MyCallable(String name){
        this.name = name;
    };
    public String call() throws Exception {
        //call方法内实现逻辑
        return name;
    }
}

(2)创建一个线程池接收MyCallable实例:

public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建一个固定大小为5的线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);
        //创建多个有返回值的任务列表
        List<Future> list = new ArrayList<Future>();
        for (int i = 0; i < 5; i++) {
            //创建一个有返回值的线城实例
            Callable callable = new MyCallable(i + "");
            //提交线程,获取Future对象
            Future future = pool.submit(callable);
            System.out.println("提交Callable线程" + i);
            list.add(future);
        }
        pool.shutdown();
        for (Future future:list) {
            System.out.println("获得Callable线程结果"+future.get().toString());
        }
    }
}

结果:

提交Callable线程0
提交Callable线程1
提交Callable线程2
提交Callable线程3
提交Callable线程4
获得Callable线程结果0
获得Callable线程结果1
获得Callable线程结果2
获得Callable线程结果3
获得Callable线程结果4

1.4 基于线程池创建线程

  为了避免浪费线程资源,可以使用线程池来创建线程。

具体代码如下:

package com.jzq.concurrent.Thread.ThreadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(7);
        //提交多个线程任务并执行
        for (int i = 0; i < 7; i++) {
            threadPool.execute(new Runnable() {
                                   public void run() {
                                       System.out.println(Thread.currentThread().getName()+"在运行");

                                   }
                               }
            );
        }
    }
}

结果:

pool-1-thread-1在运行
pool-1-thread-4在运行
pool-1-thread-3在运行
pool-1-thread-2在运行
pool-1-thread-5在运行
pool-1-thread-6在运行
pool-1-thread-7在运行

Java并发编程

原文:https://www.cnblogs.com/strong-FE/p/12177901.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!