您的位置:首页 > 大数据 > 人工智能

1多线程的概述2多线程(创建多个线程实例,并启动多个线程)的实现方式,main主方法是单线程的4多线程的实现方式5多线程模拟火车站售票出现问题7线程的声明周期

2017-10-26 21:19 716 查看
1多线程的概述:

进程:当前正在运行的程序,一个应用程序在内存中的执行区域(一块内存空间)。

线程:进程中的一个执行控制单元,执行路径(做的每一件事情可以看做一个线程)

一个进程可以有一个线程,也可以有多个线程(多线程)

单线程:安全性高,但效率低

多线程:安全性低,效率高(同时进行多个线程)如迅雷同时下载多个电影

2多线程(创建多个线程实例,并启动多个线程)的实现方式:

Thread类

写一个类继承Thread的子类,重写Thread的run方法(被测试类运行的方法),

测试类,创建线程实例:(和普通类一样new)子类名  变量名
= new 子类名();

启动线程:变量名.start();

String   getName();获取线程的名字

Void   setName(String name);修改线程的名字为name

多线程:cpu在执行顺序上不确定,在多个线程之间随机执行

3主方法是单线程的:

主方法在运行 的时候是单线程运行的

4多线程的实现方式:

Runnable接口

写一个子类实现Runnable接口,并重写public void run方法。

实现Runnable接口,不能直接用[getName好似静态方法]getName()方法;

必须先创建和获取线程Thread对象,用Thread对象调用getName方法。

//Static Thread  currentThread() 返回当前线程对象:Thread  t = Thread.currentThread();

T.getName();

测试类:创建线程实例:MyRunnable  mr = new MyRunnable();

将子类创建的对象 传给Thread  :  Thread t = new Thread(mr);

//用 线程Thread对象调用getName方法。t.setName()

启动线程: t.start();

5多线程模拟火车站售票出现问题:

Static void sleep(long millis):让当前线程暂停一会,时间单位是毫秒

6分析火车站售票出现问题原因:

是因为不同的线程在进入if之后
Thread.Sleep方法让它休息一会,并没有卖出票,那下一个线程也会通过if判断,所以会出现-1 -2的情况

7使用同步代码块解决多线程案例中出现的问题:

问题出现的原因:1要有多个线程2要被多个线程所共享的数据3多个线程并发的访问共享的数据

同步:安全性高,效率低

不同步:效率高,但是安全性低

Synchronized:同步(修饰符),可以修饰代码块和方法,被修饰的带玫瑰和方法一旦被摸个线程访问,则直接锁住,其他的线程将无法访问

同步代码块:

Synchronized(锁对象){

需要锁住运行的代码

}

注意:锁对象要被所有的线程锁共享。

8同步方法:

Synchronized :使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部被锁住,其他的线程无法再访问

Synchronized:注意

非静态同步方法的锁对象是this

静态的同步方法的锁对象是当前类的字节码对象(文件)

Get.class();获取字节码文件对象  或者类名.class();

9线程的声明周期:
生命周期:一个对象的从生到死的过程

新建 就绪    运行   死亡

创建线程对象 ——》具备了执行条件——》具备了执行条件——》线程对象变成了垃圾

没有具备执行权力 具备了执行权力

 

等待方法:等待wait();让当前的线程对象等待

  唤醒notify();让等待的线程继续执行(是让线程回到就绪步骤)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐