大仙1998

三秒钟学会多线程

程序:可以有很多种语言

进程:程序运行起来就变成了进程,进程下面包含线程,资源分配的最小单位(qq,微信...)

每个进程都有独立的代码和数据空间,一个进程可以有多个线程.

线程:CPU调度的最小单位.

run() : 线程的入口,可以定义代码,也可以调用其他方法

start() : 是该线程开始执行,JAVA虚拟机自己调用该线程的run方法.

创建线程的三种方法:

1.创建Thread的子类

创建: 继承 Thread +重写 run()

启动: 创建子类对象 对象.start()

:run()是属于Thread类的

2.实现Runnable接口(推荐)  (面向接口编程,避免单继承局限)

创建: 实现 Runnable接口 +重写 run()方法

启动静态代理 Thread

a)、创建真实角色 实现类对象

b)、创建代理角色 Thread 对象+真实角色的引用

c)、代理角色.start

优点:避免了单继承的局限性,可实现资源共享

 

3.实现callable

优点: 能声明异常,能有返回值 缺点: 编写复杂麻烦

:start()是属于Thread类的.

 

线程的生命周期:

 

1.线程的五种状态:

1)、新生状态: new

2)、就绪状态: runnable

3)、运行状态: running

4)、阻塞状态: blocked

5)、执行完毕: dead

 

  1. 阻塞 : sleep

模拟网络延时

 

  1. 终止

不要调用 stop destory 方法 , 太暴力,一盆冷水让其停

  1. 当前线程

Thread.currentThread()

  1. 优先级

只代表概率,不代表绝对先后(优先级越高,代表优先被CPU调用的概率高)

MIN_PRIORITY 1

NORM_PRIORITY :  5 默认优先级

MAX_PRIORITY 10

getPriority()    setPriority()

 

: 同步 : synchronized(同步锁)

  1. 同步块
  2. 同步方法
  3. 死锁  

过多的同步容易死锁

  1. 锁方法

//23张票,卖给3个人,3个人同时购买 资源:23张票,3个人共享  锁方法

public class Web_12306_01 implements Runnable{

int tickets=23;

//程序的入口

public static void main(String[] args) {

Web_12306_01 web=new Web_12306_01();

new Thread(web,"罗杰").start();

new Thread(web,"鹰眼").start();

new Thread(web,"BIG.MUM").start();

}

 

//线程的入口

public void run() {

while(true){

//A B C在此排队

boolean flag=test();

//循环停止条件 (必须要使循环停止下来)

if(flag==false){

return;

}

}

}

 

//定义一个方法,方便run()调用

public synchronized boolean test(){

if(tickets<=0){

return false;

}

try {

Thread.sleep(200);//放大问题的可能性,延时200ms

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"买了第"+tickets--+"张票");

return true;

}

}

 

posted on 2019-05-13 08:25  大仙1998  阅读(162)  评论(0编辑  收藏  举报

导航