多线程
来源:互联网 发布:宁波淘宝商城外包 编辑:程序博客网 时间: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资源。如果一段时间后导致暂停的原因得到解决,线程从阻塞状态转入到就绪状态。
◆死亡:
线程运行结束了线程会自动死亡;线程运行中发送Error或Exception线程也会死亡。
思考如下案例:运行后会出现一张票买多次,或则出现负数的情况,这就是没有同步导致的问题。
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();
}
}
}
}
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- BZOJ 4282 慎二的随机数列 动态规划
- JavaEE——CSS3样式表
- 从哈佛1000多页的课程名单里,我看到了何谓“大学”
- Linux信号的基本概念
- 线性表的顺序存储结构(C语言实现)
- 多线程
- 用virtualenv管理python3运行环境 1. 简介 virtualenv可以用来管理互不干扰的独立python虚拟环境,在有些场景下非常有用,例如: 你有两个python项目,
- 批量梯度下降BGD、随机梯度下降SGD、小批量随机梯度下降MSGD
- 自己编写的响应式图片轮播效果
- 【SQL高级教程】数据库学习笔记
- POJ3190:Stall Reservations(贪心)
- PAT乙级1039. 到底买不买(20)
- Hive学习笔记 2 Hive的数据类型
- linux执行.sh文件提示jdk环境问题