多线程的概念以及如何创建线程

本文介绍了JavaEE中的多线程概念,重点讲解了通过继承Thread类、实现Runnable接口以及使用Callable和FutureTask创建线程的方法,强调了不同方式的选择依据和现代编程中的最佳实践。
摘要由CSDN通过智能技术生成

本篇参考书籍为JaveEE零基础入门/史胜辉,王春明,沈学华编著.—北京:清华大学出版社,2021.1(2022.8重印) ISBN 978-7-302-56938-1


前言

小弟最近开始自学java开发,被多线程难住了,在参考了书籍以及网上的资料后,做了以下总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、线程是什么?

首先,要区别线程和进程,进程是程序的一次执行过程,对应了代码的加载、执行和执行结束的一个完整过程;而线程是比进程更小的执行单元,单个进程的执行可以产生多个线程。
这样说可能很难理解,举个例子:
你需要做晚饭,但是做饭要买菜、洗菜以及炒菜等等,这个时候你叫来朋友张三帮你洗菜,最后完成了晚饭的制作。
在这里,做晚饭是一个进程,你是主线程,你朋友是子线程,通过将一个大任务分成一个个小任务,然后由多个线程完成称为多线程

二、线程的创建

Java中创建线程的主要方式分为三种:继承 Thread 类,实现 Runnable 接口,使用 Callable 和 FutureTask

1.继承 Thread 类

通过创建一个自定义类继承 java.lang.Thread 类,并重写 run() 方法来定义线程需要执行的任务。
其中,Thread类常用的方法包括start()方法、run()方法、join()方法、interrupt()方法等。

下面给出例子:

public class demoThread extends Thread {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Thread t = Thread.currentThread();  //调用Thread类的currentThread()静态方法获得当前主线程的引用
		System.out.println("当前主线程是:"+t);
		t.setName("MyThread");  //修改主线程的名字为MyThread
		System.out.println("当前主线程是:"+t);
		demoThread mt = new demoThread();  //创建子线程mt
		mt.setName("123");
		System.out.println("当前次线程是:"+mt);
		mt.start();  //启动子线程,执行run()方法
	}
	
	public void run() {
		int sum = 0;
		for(int i=0;i<101;i++)
		{
			sum+=i;
		}
		System.out.println("1+2+…+100="+sum);
	}
}

运行结果如下:
在这里插入图片描述

2.实现 Runnable 接口

和继承Thread类不同的是,Runnable接口只有一个run()方法,实现该接口的类必须重写该方法。

下面给出例子:

public class SimpleThread implements Runnable {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Thread t = new Thread(new SimpleThread(),"线程1"); //创建线程对象
		t.start();
		System.out.println("主线程运行结束");
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		int i = 1;
		while(i<=10)
		{
			try
			{
				System.out.print("*");
				Thread.sleep(1000); //sleep(long millis)方法,参数代表线程休眠的时间,这里是1s
			}catch(InterruptedException e){
				e.printStackTrace();
			}
			i++;
		}
	}

}

运行结果如下:
在这里插入图片描述
需要注意的是,主线程在运行到System.out.println(“主线程运行结束”)时就已经结束了,而子线程的run()方法还在运行。显然,两个线程运行是相互独立的,主线程只能启动子线程的运行,而不能终止它的运行。

3.使用 Callable 和 FutureTask

创建一个类实现 java.util.concurrent.Callable 接口,并实现 call() 方法。使用 FutureTask 封装 Callable 实例,然后通过 FutureTask 创建线程。这种方式允许线程执行有返回值的任务,并且可以捕获异常。

下面给出例子:

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        // 执行有返回值的任务
        return Thread.currentThread().getName() + "完成了任务!";
    }

    public static void main(String[] args) {
        MyCallable myCallable = new MyCallable();
        FutureTask<String> futureTask = new FutureTask<>(myCallable);
        Thread thread = new Thread(futureTask);
        thread.start();

        try {
            String result = futureTask.get(); // 获取线程执行结果
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上就是在Java中创建线程的三种主要方式,每种方式都有其适用的场景,选择合适的方式来创建线程取决于具体的应用需求。在现代Java编程中,更推荐使用基于接口的方式来创建线程,因为它允许多重继承,使得代码更具灵活性。同时,Java并发包 java.util.concurrent 提供了更丰富的并发工具和框架,可以帮助开发者更高效地管理和组织线程。


总结

以上就是多线程的概念以及线程的创建基础知识,小弟也就学到这里,后面小弟还会分享一下线程的同步,也希望大家看到小弟哪里写的不对的,能私信小弟,谢谢!!

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值