多线程

◆程序

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

 

◆进程

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

 

进程的特点:

1.动态性。

2.并发性。

3.独立性。

 

◆线程

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

 

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

多线程的优势

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

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

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

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

创建多线程

★继承Thread类,重写run方法

★实现Runnable接口,实现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();

线程的生命周期

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


 

◆新建:

使用new关键字创建一个线程对象,在尚未调用start()方法前线。

◆就绪:

调用线程的start()方法后(注意:线程不是一调用start()方法就立即执行,必须等到线程获得CPU资源才可以执行)

◆运行:

就绪状态的线程获得CPU资源就到了运行状态(但是线程不会“霸占”CPU)

◆阻塞:

一个正在执行的线程因为某些原因而导致的暂停(eg:打印机缺纸、等待用户输入….),阻塞时线程会让出CPU资源。如果一段时间后导致暂停的原因得到解决,线程从阻塞状态转入到就绪状态。

◆死亡:

线程运行结束了线程会自动死亡;线程运行中发送ErrorException线程也会死亡。

 

思考如下案例:运行后会出现一张票买多次,或则出现负数的情况,这就是没有同步导致的问题。

public class Test4 implements Runnable{

public int tickets = 10;

public void run() {

while(tickets>0){

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"卖出第"+tickets+"!");

tickets--;

}

}

public static void main(String[] args) {

Test4 t = new Test4();

Thread th1 = new Thread(t,"窗口一:");

Thread th2 = new Thread(t,"窗口二:");

Thread th3 = new Thread(t,"窗口三:");

th1.start();

th2.start();

th3.start();

}

}

完成线程同步有两种方式:

★代码块同步

★方法同步


综合案例一:

package anli;

import java.awt.*;

import java.awt.event.*;

import java.util.Date;

import javax.swing.*;

public class MyTime extends JFrame implements Runnable{

JLabel jl;

JPanel jp;

public MyTime(){

jl = new JLabel("北京时间  00:00:00");

jp = new JPanel();

jp.add(jl);

this.add(jp);

jl.setFont(new Font("黑体",Font.BOLD,30));

jp.setBackground(Color.BLACK);//设置背景色

jl.setForeground(Color.RED);//设置前景色

this.pack();

this.setVisible(true);

}

public static void main(String[] args) {

MyTime mt = new MyTime();

Thread t = new Thread(mt);

t.start();

}

public void run() {

while(true){

Date d = new Date();

String s = d.toString().substring(11, 19);

jl.setText("北京时间 "+s);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值