本篇参考书籍为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 提供了更丰富的并发工具和框架,可以帮助开发者更高效地管理和组织线程。
总结
以上就是多线程的概念以及线程的创建基础知识,小弟也就学到这里,后面小弟还会分享一下线程的同步,也希望大家看到小弟哪里写的不对的,能私信小弟,谢谢!!