Java线程: 第一章 走进Java世界中的线程
1.1.1 线程的创建,启动和运行
在Java平台中创建一个线程就是创建一个Thread类(或其子类)的实例。
运行一个线程实际上就是让Java虚拟机执行该线程的run方法,从而使相应线程的业务逻辑处理代码得到执行。为此,我们先要启动线程,使用Thread类的start方法即可。启动一个线程的实质是请求Java虚拟机运行相应的线程,而这个线程何时能够运行是由线程调度器决定的。因此,start方法的调用并不意味着相应线程已经开始执行,这个线程可能稍后才被运行,甚至也可能永远不被执行。
Thread类的两个常用构造器是Thread()和Thread(Runnable target)。对应的创建线程也是两种方式。
public class WelcomeApp extends Thread{ //继承Thread类重写run方法 public static void main(String[] args) { // TODO Auto-generated method stub Thread welcomeThread = new WelcomeApp(); welcomeThread.start(); System.out.printf("1.Welcme!It's %s.%n",Thread.currentThread().getName()); } public void run() { System.out.printf("2.Welcme!It's %s.%n",Thread.currentThread().getName()); } }
public class WelcomeApp2 implements Runnable{ //创建一个Runnable接口实例,将其作为参数传给Thread,重写run方法 public static void main(String[] args) { // TODO Auto-generated method stub Thread wThread = new Thread(new WelcomeApp2()); wThread.start(); System.out.printf("1.Welcme!It's %s.%n",Thread.currentThread().getName()); } public void run(){ System.out.printf("2.Welcme!It's %s.%n",Thread.currentThread().getName()); } }
输出结果为
1.Welcme!It's main.
2.Welcme!It's Thread-0.
或者
2.Welcme!It's Thread-0.
1.Welcme!It's main.
我们不支持直接调用run方法,因为如果直接调用run方法,那么这个线程的run方法其实运行在当前线程中(比如在main中调用,那么就在main中)而不是在自身线程之中,违背了创建线程的初衷。
1.1.2 Runnable接口
Runnable接口只定义了一个run方法:
public void run()
Runnable接口可以被看做对任务进行的抽象,任务的处理逻辑就体现在run方法中。Thread类实际上是Runnable接口的一个实现类,Thread.run()源码:
pubic void run(){ if(target != null) target.run(); }
1.1.3 线程属性
1.3.4 Thread类的常用方法
1.2 线程的层次关系
假设线程A所执行的代码创建了线程B,那么,习惯上我们称线程B为线程A的子线程,线程A为线程B的父线程。
在Java中,一个线程的优先级默认为该线程的父线程的优先级。