多线程

来源:互联网 发布:宁波淘宝商城外包 编辑:程序博客网 时间:2024/06/05 08:20

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

 

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

 

进程的特点:    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();

}

}

}

}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 普通话准考证丢了怎么办 信用卡还款逾期了怎么办 淮北建洗煤厂需要怎么办 建设工程不结算怎么办 考监理没有职称怎么办 公开招标两次招标失败怎么办 山东省植保员证怎么办 工伤没开病假单怎么办 邮储银行怎么办金卡 农机被交警查怎么办 广联达识别板筋负筋重叠怎么办 掌上品的钱怎么办 财务纠纷被起诉怎么办 牙齿补后疼痛怎么办 牙齿表面蛀了怎么办 虫牙全掉了怎么办 牙齿蛀光了怎么办 虫牙全部掉完了怎么办 不喜欢向人请教怎么办 单位不交公积金怎么办 电锯链条掉了怎么办 天津公积金怎么办外地转入 学籍档案涂抹了怎么办 气相点火失败怎么办 小米闹钟声音小怎么办 河北省监理员证怎么办 买的商铺烂尾了怎么办 钢表带被磨花了怎么办 资料员到期了怎么办 八大员挂靠社保怎么办 安许证三类人员不足了怎么办 考试准考证号写错了怎么办 科目一失约两次怎么办 钢筋送检两次不合格怎么办 公路原材料抽检不合格怎么办 混凝土回弹强度不合格怎么办 毕业证照片太丑怎么办 政审时找不到档案怎么办 劳动解除书开不出来怎么办 双流办健康证怎么办 户口本人数满了怎么办