走进Java世界中的线程
1.进程、线程与任务
进程是程序运行的实例,一个简单的java程序如下所示:
import java.util.Date;
public class SimlpeJavaApp {
public static void main(String[] args) throws Exception
{
while (true)
{
System.out.println(new Date());
Thread.sleep(1000);
}
}
}
进程是程序向操作系统申请资源的最小单位,线程则是进程中可独立执行的最小单位。一个进程可以包含多个线程,同一个进程中的所有线程共享该进程中的资源。
2.Java线程API简介
2.1线程的创建、运行及启动
在Java平台中创建一个线程就是创建一个Thread类的实例。线程的任务处理逻辑Thread类的run实例方法中直接实现或者通过该方法进行调用,因此run方法为线程的任务处理逻辑入口。
Thread类的start方法的作用是启动相应的线程。启动一个线程的使之是请求Java虚拟机运行相应的线程,而这个线程具体何时能够运行是由线程调度器决定的。
Thread类的两个常用构造器是Thread()和Thread(Runnable target)。
下面以创建一个处理任务为打印一行欢迎信息的简单线程为例:
以定义Thread类子类的方式创建线程
import java.lang.String;
public class WelcomeApp {
public static void main(String[] args)
{
Thread welcomeThread = new WelcomeThread();
welcomeThread.start();
System.out.printf("1.Welcome!I'm %s.%n",Thread.currentThread().getName());
}
}
class WelcomeThread extends Thread
{
@Override
public void run()
{
System.out.printf("2.Welcome!I'm %s.%n",Thread.currentThread().getName());
}
}
其输出为
1.Welcome!I’m main.
2.Welcome!I’m Thread-0.
以创建Runnable接口实例的方式创建线程
public class WelcomeApp1 {
public static void main(String[] agrs)
{
Thread welcomeThread = new Thread(new WelcomeTask());
welcomeThread.start();
System.out.printf("1.Welcome!I'm %s.%n",Thread.currentThread().getName());
}
}
class WelcomeTask implements Runnable{
@Override
public void run()
{
System.out.printf("2.Welcome!I'm %s.%n",Thread.currentThread().getName());
}
}
运行结果为
1.Welcome!I’m main.
2.Welcome!I’m Thread-0.
在多次运行之后,运行结果也可能为
2.Welcome!I’m Thread-0.
1.Welcome!I’m main.、
无论采用什么方法创建线程,当线程的run方法执行结束,相应线程也就结束了。线程属于一次性用品,无法调用一个已结束线程的start方法使其重新运行。
Java平台中任意一段代码总是由确定的线程负责执行的,这个线程相应的称为这段代码的执行线程。同一段代码可以被多个线程执行。而当前线程则是相对的,即该娘层次上的当前线程。
线程的run方法总是由虚拟机调用的,虽然也可以在代码中直接调用,但是直接调用的结果一般都不理想。
如以下代码块所示,应用代码直接调用线程run方法(应避免这么做)
public class WelcomeApp2 {
public static void main(String [] args)
{
Thread welcomeThread = new Thread(new Runnable() {
@Override
public void run()