进程: 本质上是正在运行中的程序。
线程: 是进程中一个负责程序执行的控制单元(执行路径)。一个进程至少会有一个线程。
一个进程有多个执行路径称之为多线程。开启多个线程是为了同时运行多部分代码。
每一个线程都有自己运行的内容,这些内容就是线程要执行的任务。
多线程决解了多部分代码同时运行的问题,但是太多的线程同时运行会导致程序的效率降低。
Java的多线程系统兼容单核和多核两种操作系统:
|-- 在单核系统中 并发执行的线程 共享CPU,每一个线程得到一片CPU时间周期,所以在单核系统中多个线程不是真在同时运行的。
|-- 在多核的系统中,多个线程有可能被同步执行。程序的效率更高,操作速度更快。
Java 的 Thread 类:
|-- Java的多线程系统基于Thread 类,它封装了线程的执行。Thread 类的实例就是线程的代理。
Java主线程:
Java程序启动时,开始运行的线程,称为主线程。
|-- 其他的子线程都是从主线程产生的
|-- 通常,主线程是最后结束执行的线程,因为他要关闭各种动作。
|-- 主线程默认是main,5,main。
/**分析下面代码**/
class CurrentThreadDemo
{
public static void main(String[] args)
{
Thread t = Thread.currentThread();//返回当前线程的引用
System.out.println("当前正在运行的线程是" + t);//当前正在运行的线程是Thread[main,5,main]
t.setName("abc");
System.out.println("把线程名称改成" + t);//把线程名称改成Thread[abc,5,main]
try{//因为sleep()可能抛出InterruptedException异常所以要被监视
for(int i=0;i<=5;i++){
System.out.println(i);
t.sleep(100);//在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
}
}catch(InterruptedException e){
System.out.println("当前线程被中断");
}
}
}
/**[main,5,main]分别表示线程的名称、优先级、线程所属线程组的名称**/
Java创建线程的两种方法:
|-- 第一种方式: 实现 Runnable 接口
/*
新建一个子线程和主线程一起运行
主线程要实现的任务打印6-10
通过实现 Runnable 接口的 run() 封装子线程要实现的任务
子线程要实现的任务是打印1-5
我们希望在任务对象创建的时候就开始一个新的线程
那么就要在构造函数中创建新的 Thread 对象。并运行线程。
*/
class NewThread implements Runnable
{
private Thread t;
NewThread(){
t = new Thread(this);
System.out.println("新建一个子线程:"+t);
t.start();
}
public void run(){//新进程要实现的任务
try{
for(int i=1;i<=5;i++){
System.out.println(i +"---"+ t.getName());
t.sleep(100);
}
}catch(InterruptedException e){
System.out.println("子线程被中断");
}
System.out.println(t.getName() + "子线程退出");
}
}
class ThreadDemo
{
public static void main(String[] args)
{
new NewThread();
new NewThread();
Thread t = Thread.currentThread();
try{
for(int i=6;i<=10;i++){
System.out.println(i);
t.sleep(100);
}
}catch(InterruptedException e){
System.out.println("主线程被中断");
}
System.out.println("主线程退出");
}
}
|-- 第二种方式: 扩展 Thread 类
/**
通过继承
Thread 类创建子线程
**/
class NewThread extends Thread
{
NewThread(){
super("pan");
System.out.println("新建一个子线程:"+this);
}
public void run(){//新进程要实现的任务
try{
for(int i=1;i<=5;i++){
System.out.println(i +"---"+ this.getName());
sleep(100);//继承Thread就拥有了它里面的方法,可以直接使用
}
}catch(InterruptedException e){
System.out.println("子线程被中断");
}
System.out.println(this.getName() + "子线程退出");
}
}
class ThreadDemo
{
public static void main(String[] args)
{
NewThread n = new NewThread();
n.start();
Thread t = Thread.currentThread();
try{
for(int i=6;i<=10;i++){
System.out.println(i);
t.sleep(200);
}
}catch(InterruptedException e){
System.out.println("主线程被中断");
}
System.out.println("主线程退出");
}
}
如果不重写 Thread 的其他方法,创建线程的最好方法是实现Runnable接口,通过实现Runnable接口不需要继承Thread 可以自由的继承其他类。