Java的多线程

来源:互联网 发布:各个国家顶级域名 编辑:程序博客网 时间:2024/05/22 00:28

一、多线程的概念及优势

1.程序

程序就是一段静态的代码,他是程序执行的蓝本。

2.进程

进程本质是程序的一次动态执行。

进程的特点:  1.动态性。2.并发性。 3.独立性。

3.线程

进程内部的一个执行单元。也可称为子进程。

说明:线程也可以理解为程序的一条执行路径。前面所有案例(除了GUI中,他们有内建的多线程支持)都是单线程。任何程序都是从main方法开始往下执行,只会有一条执行路径。所以前面的案例都是单线程,这条线程是主线程mian线程。

多线程的优势

Ø 多线程使系统空转时间减少,提高CPU利用率

Ø 进程间不能共享内存,但线程之间共享内存非常容易

Ø 使用多线程实现多任务并发比多进程的效率高

Ø Java语言内置多线程功能支持,简化了Java的多线程编程 

二、创建多线程的步骤及语法

★继承Thread类,重写run方法

◆语法:

class Test extends Thread{//继承Thread

public void run() {//重写run方法

//方法体

}

}

★实现Runnable接口,实现run方法

◆语法:

class Test implements Runnable{//实现Runnabel接口

public void run() {//实现run方法

//方法体

}

}

★启动线程:

新建的线程不会自动执行,必须通过start()方法启动。

注意:

1.直接调用run()方法不会启动线程,只是一次普通的方法调用。在多线程的程序中永远不会调用run方法。

2.一条线程只能启动一次。如果启动多次会报IllegalThreadStateException异常。

◆启动继承Thread类的线程

Test t = new Test();

t.start();

◆启动实现Runnable接口的线程

Test t = new Test();

Thread th = new Thread(t);

th.start();

★创建线程的方法对比:


 

优点

缺点

继承Thread

简单

无法再继承其他类

无法实现资源共享

实现Runnable接口

可以继承其他类

可以实现资源共享

复杂

三、线程的生命周期

当线程被创建并启动后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,他要经历新建(New)、就绪(Runnabel)、运行(Running)、阻塞(Blocked)和死亡(Dead)五种状态。尤其是当线程启动后,他不是一直“霸占”CPU独自运行,CPU需要在多条线程间切换,于是线程状态会多次在运行、阻塞、就绪之间切换。


四、线程的同步

1.间接相互制约:AB两条线程,A请求打印机时,CPU将打印机分配给BA只能等待B打印完,A才能从阻塞转为就绪态。

2.直接相互制约:直接相互制约主要用于进程间相互合作。

案例:

package anli;

import java.awt.*;

import javax.swing.*;

import java.util.*;

public class RunHello extends JFrameimplements Runnable{

String s = "Hello World!";

int nextX = 0;

int nextY = 0;

Color nextColor;

Font nextFont;

Random rand = new Random();

public RunHello(){

this.setSize(1366, 768);

this.setVisible(true);

}

public void paint(Graphics g){

g.setColor(nextColor);

g.setFont(nextFont);

g.drawString(s,nextX,nextY);

}

public static void main(String[] args){

RunHello rw = new RunHello();

Thread t = new Thread(rw);

t.start();

}

public void run() {

while(true){

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

nextX = rand.nextInt(1367);

nextY = rand.nextInt(769);

nextColor = new Color(rand.nextInt(256),rand.nextInt(256),rand.nextInt(256));

nextFont = new Font("黑体",Font.BOLD,rand.nextInt(41)+10);

this.repaint();

}

}

}


原创粉丝点击