您当前的位置: 首页 > 热点 > > 内容页

大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

来源:博客园 2023-06-09 18:55:39

在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高。Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是继承Thread类、实现Runnable接口和使用线程池。

但是,你们知道吗?其实在创建线程的过程中,除了上述描述的方法还有很多种方式可以选择哦。今天,我们就来揭开这个惊天秘密,一起来了解一下Java并发编程中创建线程的八股文。

一. 创建线程的方法:1. 继承Thread类创建线程

这是最基本的创建线程的方式,我们可以通过继承Thread类来创建一个自定义的线程类,然后重写run()方法,实现线程的逻辑。


(资料图)

public class MyThread extends Thread {    @Override    public void run() {        // 线程逻辑    }}// 创建并启动线程MyThread myThread = new MyThread();myThread.start();
2. 实现Runnable接口创建线程

这是另一种常见的创建线程的方式,我们可以通过实现Runnable接口来创建一个自定义的线程类,然后将该类实例化并传递给Thread类的构造方法中,最后调用start()方法启动线程。

public class MyRunnable implements Runnable {@Overridepublic void run() {// 线程逻辑}}// 创建并启动线程MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();
3. 实现Callable接口创建线程

Callable接口与Runnable接口类似,但是它可以返回一个结果并抛出异常。我们可以通过实现Callable接口来创建一个自定义的线程类,然后将该类实例化并传递给FutureTask类的构造方法中,最后调用start()方法启动线程。

public class MyCallable implements Callable {@Overridepublic String call() throws Exception {// 线程逻辑return "result";}}// 创建并启动线程MyCallable myCallable = new MyCallable();FutureTask futureTask = new FutureTask<>(myCallable);Thread thread = new Thread(futureTask);thread.start();// 获取线程返回结果String result = futureTask.get();
4. 使用线程池创建线程

线程池是一种重用线程的机制,可以减少线程创建和销毁的开销。我们可以通过Executors类提供的静态方法来创建不同类型的线程池,然后将任务提交给线程池执行。

ExecutorService executorService = Executors.newFixedThreadPool(10);// 提交任务并执行executorService.submit(new Runnable() {@Overridepublic void run() {// 线程逻辑}});// 关闭线程池executorService.shutdown();
5. 使用定时器创建线程

定时器可以用来定时执行某个任务。我们可以通过Timer类来创建一个定时器,然后将任务添加到定时器中执行。

6. 使用ScheduledExecutorService创建线程

ScheduledExecutorService是一种可以调度任务执行的线程池。我们可以通过它来创建一个定时任务,也可以创建一个周期性任务。

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);// 创建定时任务并执行scheduledExecutorService.schedule(new Runnable() {    @Override    public void run() {        // 线程逻辑    }}, 1, TimeUnit.SECONDS);// 创建周期性任务并执行scheduledExecutorService.scheduleAtFixedRate(new Runnable() {    @Override    public void run() {        // 线程逻辑    }}, 1, 1, TimeUnit.SECONDS);// 关闭线程池scheduledExecutorService.shutdown();
7. 使用Fork/Join框架创建线程

Fork/Join框架是Java 7中引入的一种并行执行任务的机制。它可以将一个大任务拆分成多个小任务并行执行,最后将结果合并。

public class MyTask extends RecursiveTask {    private int start;    private int end;    public MyTask(int start, int end) {        this.start = start;        this.end = end;    }    @Override    protected Integer compute() {        if (end - start <= 1000) {            // 执行小任务            return 0;        } else {            // 拆分大任务            int mid = (start + end) / 2;            MyTask leftTask = new MyTask(start, mid);            MyTask rightTask = new MyTask(mid + 1, end);            leftTask.fork();            rightTask.fork();            // 合并结果            return leftTask.join() + rightTask.join();        }    }}// 创建并执行任务ForkJoinPool forkJoinPool = new ForkJoinPool();MyTask myTask = new MyTask(1, 10000);int result = forkJoinPool.invoke(myTask);
8. 使用Semaphore创建线程

Semaphore是一种计数器,用来控制同时访问某个资源的线程数量。我们可以通过Semaphore来创建一个有限的线程池。

Semaphore semaphore = new Semaphore(10);// 创建并执行任务Runnable runnable = new Runnable() {    @Override    public void run() {        try {            semaphore.acquire();            // 线程逻辑        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            semaphore.release();        }    }};for (int i = 0; i < 100; i++) {    new Thread(runnable).start();}
二. 线程和线程体的关系

说到线程大家都知道,它是一种重要的多任务处理机制。可以让我们同时执行多个任务,并且可以提高程序的效率。上述也给大家带来了很多种创建线程的方式,但是说到这里,我发现经常有朋友问:线程体和线程是什么关系?其实,简单说:线程体就是是线程的具体执行代码。那么接下来就让我们具体来看看线程和线程体的关系吧!

1. 线程和线程体的关系

在Java中,线程和线程体是两个不同的概念。

线程是一条执行路径,线程体是线程的具体执行代码。每个线程都有一个与之相关的线程体。线程体是实现了Runnable接口的类的实例。线程体可以是一个独立的类,也可以是一个内部类。线程创建之后,它的run()方法就会被调用,run()方法中的代码就是线程体的执行代码。

2. 案例说明

可能会有朋友觉得上述的解释过于书面化,那么如果通过生活实例来说明线程体和线程的关系的话,我们可以将线程理解成为一个人,线程体则是这个人所做的事情。

比如,在上班的路上,我们可以同时进行多个任务,比如听音乐、看书、发短信等等。这些任务就可以看做是这个人的线程体。线程就是这个人同时进行多个任务的机制。如果我们只有一个人,那么这个人必须先做完一个任务才能开始做下一个任务。这样就会浪费很多时间。但是如果我们有两个人,那么一个人可以看书,另一个人可以听音乐,这样就可以同时进行多个任务,提高了效率。

3. 代码案例

下面给大家带来一个:创建多个线程来同时执行多个任务的简单的代码案例,示例如下:

public class MyThread implements Runnable {    private String taskName;    public MyThread(String taskName) {        this.taskName = taskName;    }    @Override    public void run() {        for (int i = 0; i < 5; i++) {            System.out.println(taskName + "执行了第" + (i + 1) + "次任务");            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    public static void main(String[] args) {        MyThread thread1 = new MyThread("线程1");        MyThread thread2 = new MyThread("线程2");        Thread t1 = new Thread(thread1);        Thread t2 = new Thread(thread2);        t1.start();        t2.start();    }}

在这个案例中,我们创建了两个线程,分别执行不同的任务。每个线程的线程体是MyThread类的run()方法。在run()方法中,每个线程会执行5次任务,并在每次任务之间暂停1秒钟。通过创建多个线程,我们可以同时执行多个任务,提高程序的效率。

4. 小结

通过上述介绍的Java线程和线程体的关系,大家应该都清楚了。线程是一种多任务处理机制,线程体是线程的具体执行代码。在Java中,我们可以通过创建多个线程来同时执行多个任务,提高程序的效率。希望上述可以帮助大家更好地理解Java中线程和线程体的概念哦。

三. 总结

现在大家都知道了在Java并发编程中,创建线程是一个非常重要的操作。

本文给大家介绍了八种不同的创建线程的方式,包括继承Thread类、实现Runnable接口、实现Callable接口、使用线程池、使用定时器、使用ScheduledExecutorService、使用Fork/Join框架和使用Semaphore。

每种方式都有各自的优缺点,我们需要根据实际情况选择合适的方式来创建线程。同时,我们还需要注意线程安全和性能等问题,确保程序的正确性和高效性。

在生活中,我们也可以找到很多与多线程编程相关的例子。比如,在厨房里做饭的时候,我们可以将不同的任务分配给不同的人来完成,比如一个人负责洗菜,一个人负责切菜,一个人负责烧菜等等。这样可以提高效率,也可以避免出现混乱和错误。同样,在程序中,我们也可以将不同的任务分配给不同的线程来完成,以提高程序的响应速度和吞吐量。因此,多线程编程是非常重要的,值得我们深入学习和掌握。希望能对大家有所帮助哦。

上一篇 下一篇
x
推荐阅读 更多
大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,

2023-06-09
中银航空租赁(02588)授出合共164.47万股的限制性股票单元奖励 环球观天下

智通财经APP讯,中银航空租赁(02588)发布公告,公司根据计划于2023年6

2023-06-09
档案整理公司_档案整理

1、收集文件和资料。2、文件材料的收集对象主要包括:反映本单位主要职

2023-06-09
热议:外八庙必去的三个景点(外八庙)

八庙必去的三个景点,外八庙这个问题很多朋友还不知道,来为大家解答以

2023-06-09
8-9级雷暴大风!南通发布强对流蓝色预警

预计10日午后到夜里,我市各县(市、区)、园区和沿岸海区自北向南将出

2023-06-09
贵州省政协原党组副书记、副主席周建琨被双开

经中共中央批准,中央纪委国家监委对贵州省政协原党组副书记、副主席周

2023-06-09
环球快播:幻体续命游戏手机在线观看_幻体 续梦游戏迅雷下载地址

1、你要的这部电影高清版已发到你百度云盘:lwyy0901。2、请在你的百度

2023-06-09
丰田将在美密歇根州研发总部新建汽车电池实验室,投资额近5000万美元

丰田将在美密歇根州研发总部新建汽车电池实验室,投资额近5000万美元:

2023-06-09
英国要办AI峰会,英媒操心“请不请中国”

英国要办AI峰会,英媒操心“请不请中国”:当地时间7日晚,英国首相办

2023-06-09
京新药业:6月8日融资买入1047.71万元,融资融券余额3.8亿元

6月8日,京新药业(002020)融资买入1047 71万元,融资偿还739 44万元

2023-06-09