1.线程在基本概念
1) 线程是一个程序内部的顺序控制流。简单说线程就是程序中执行的路径。
2) 进程的理解就是程序运行的主线程,也就是即将要开始运行的线程。
3) 线程和进程的区别:
a) 每个进程都有独立代码和数据空间(进程上下文),进程间的切换会有较大的开销。
b) 线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
c) 多进程:在操作系统中能同时运行多个任务(程序)。
d) 多线程:在同一个应用程序中有多个顺序流同时执行。
4) Java的线程是通过java.lang.Thread类来实现的。
5) VM启动时会有一个由主方法(publicstatic void main(){})所定义的线程。
6) 可以通过创建Thread的实例来创建新的线程。
7) 每个线程都是通过某个特定Thread对象对应的方法run()来完成其操作的,方法run()称为线程体。
8) 通过调用Thread类的start()方法来启动一个线程。
2.基本的线程机制
2.1定义任务
线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口提供。要想定义任务,只需要实现Runnable接口并编写run()方法,使得任务可以执行你的命令。
class Runner1 implements Runnable
{
@Override
public void run()
{
for (int i = 0; i < 100; i++)
{
System.out.println("Runner1 : " + i);
}
}
}
2.2Thread类
Thread类的使用有两种:
1) 可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thread
{
public void run{….}
}
2) 将Runnable对象转换为工作任务的传统方式是把它提交给一个Thread构造器。如:
Thread t = new Thread(Runnable r);
2.2.3创建线程例子
下面我们创建的例子,主要是继续Thread类的线程,和实现Runnable接口的线程。这里笔者强调的是,能够使用实现接口实现的尽量使用接口。当然这两中方式都需要我们去重写run的方法。只是有点不一样的是,使用Runnable的接口,如果你没有new Threade,将Runnable对象放入Thread中,那个只是方法调用,也就是依然在一条的线程上调用。而如果我们使用到Thread类,说明我们告诉CPU开启一条新的线程,这个时候CPU依然是单线程运行,只是CPU线程或快速切换多个新创建的线程之间,就好像是多线程在运行。
package com.owen.thread;
/**
* 同步线程与异步线程应用
* @author OwenWilliam 2016-7-21
* @since
* @version v1.0.0
*
*/
public class TestThread1
{
public static void main(String[] args)
{
Runner1 r = new Runner1();
//使用该方法是线程方法,只会执行好了r.run()方法之后才会执行下一个线程
//r.run();
//开启一个新的线程,执行这个线程,其它线程也可以执行,也就是一起执行
Thread t = new Thread(r);
t.start();
for (int i = 0; i < 100; i++)
{
System.out.println("Main Thread : ------" + i);
}
}
}
/**
* 创建一个Runner1引用 Runnable的接口,重写run方法
* 提倡使用Runnable接口
* @author OwenWilliam 2016-7-21
* @since
* @version v1.0.0
*
*/
class Runner1 implements Runnable
{
@Override
public void run()
{
for (int i = 0; i < 100; i++)
{
System.out.println("Runner1 : " + i);
}
}
}
/**
* 创建Runner2继承Thread,调用:
* Runner2 r = new Runner2();
* r.start();
* 执行与 Thread t = new Thread(r);
t.start();
一样
* @author OwenWilliam *
*/
class Runner2 extends Thread
{
@Override
public void run()
{
for (int i = 0; i < 100; i++)
{
System.out.println("Runner2 : " + i);
}
}
}