共计 2404 个字符,预计需要花费 7 分钟才能阅读完成。
阅读建议
最好使用电脑观看。
如果你非要使用手机观看,那请把字体调整到最小,这样观看效果会好一些。
碎片化阅读并不会得到真正的知识提升,要想有提升还得找张书桌认认真真看一会书,或者我们公众号的文章。
如果觉得不错,各位帮着转发转发,如果觉得有问题或者写的哪不清晰,务必私聊我~
本篇文章不是 java 语法的基本教程!在阅读之前,请保证你有面向对象的编程基础,熟悉封装、继承、多态,否则的话,你不适合阅读本篇文章,先学一下基础吧~
Java 线程基本概念
哈哈,上边扯了好大一会儿犊子才绕到 java 语法这????。没办法呀,你不了解故事背景直接看剧情总是会有些懵逼的~java 语言中的线程是对操作系统线程的一种抽象,有些地方可能不太一致,遇到了再和大家说哈~
main 线程
我们之前说过,main 方法是程序入口,我们对已经编译好的 class 文件调用 java 命令时就可以运行一个 java 程序。这个过程中,其实系统自动为我们创建了一个进程和一个线程,而且这个线程的名字就叫做 main。main 线程是用来执行我们的程序的,不过系统还会为我们创建一些辅助线程来帮助 main 线程的执行,现在就先不说它们是啥了,等遇到了再说哈~
除了系统自己创建的这个 main 线程以外,我们还可以自己在程序里创建一些线程。不过我们前边说过,线程其实是去执行任务的,所以我们先看怎么定义任务。
定义任务
java 中的任务被抽象成了一个 Runnable 接口:
public interface Runnable {
public void run();
}
我们的自定义任务需要去实现这个接口,并把任务的详细内容写在覆盖的 run 方法里,比如我们定义一个输出一个字符串的任务:
public class PrintTask implements Runnable {
@Override
public void run() {
System.out.println(“ 输出一行字 ”);
}
}
看到了吧,定义一个任务就是这么简单哈~不过光有任务没啥卵用,需要创建一个线程去运行这个任务
Thread 类
java 中的 Thread 类来代表一个线程,我们需要关注它的这几种构造方法:
Thread(Runnable target, String name) 在创建线程对象的时候传入需要执行的任务以及这个线程的名称。
Thread(Runnable target) 只传入需要执行的任务,名称是系统自动生成的,或者可以在创建对象后再通过别的方法修改名称。
Thread(String name) 只传入待创建线程的名称。
Thread() 啥都不传,就是单纯构造一个线程对象而已~
执行任务
Thread 类的 start() 方法负责开始执行一个线程,让一个线程运行起来有这么两种方法:
创建 Thread 对象的时候指定需要执行的任务:
public class Test {
public static void main(String[] args) {
new Thread(new PrintTask()).start();
}
}
执行结果是:
输出一行字
通过继承 Thread 类并覆盖 run 方法:
Thread 类本身就代表了一个 Runnable 任务,我们看 Thread 类的定义:
public class Thread implements Runnable {
private Runnable target;
@Override
public void run() {
if (target != null) {
target.run();
}
}
// … 为省略篇幅,省略其他方法和字段
}
其中的 target 就是在构造方法里传入的,如果构造方法不传这个字段的话,很显然 run 方法就是一个空实现,所以如果我们想运行这个线程,就继承它并且覆盖一下 run 方法吧:
public class PrintThread extends Thread {
@Override
public void run() {
System.out.println(“ 输出一行字 ”);
}
}
因为 PrintThread 中已经有一个任务了,所以直接调用 start 方法运行它就好:
public class Test {
public static void main(String[] args) {
new PrintThread().start();
}
}
执行结果是:
输出一行字
这两种执行任务的方法说不上谁好谁坏,但是使用继承 Thread 类并且覆盖 run 方法的方式把线程和任务给弄到了一块儿了,不可分割了,也就是所谓的耦合了,所以我们平时更倾向于使用任务和线程分开处理的第 1 种执行任务的方式。当然,有时候为了演示的方便,也是会使用继承 Thread 类并且覆盖 run 方法的方式~
线程相关方法
Thread 类提供了许多方法来方便我们获取线程的信息或者控制线程,下边来一下都有哪些重要的方法吧:
获取线程 ID
long getId():系统会为每个线程自动分配一个 long 类型的 id 值,通过 getId 方法可以获取这个值。
System.out.println(new Thread().getId());
System.out.println(new Thread().getId());
System.out.println(new Thread().getId());
执行结果:
10
11
12
获取和设置线程名称
void setName(String name):设置线程的名称。
String getName():获取线程的名称。
当然,我们也可以通过构造方法去设置 Thread 的名称:
Thread t1 = new Thread(“t1”);
Thread t2 = new Thread();
t2.setName(“t2”);
System.out.println(“t1 线程的名称是:” + t1.getName());
System.out.println(“t2 线程的名称是:” + t2.getName());
执行结果是:
t1 线程的名称是:t1
t2 线程的名称是:t2