黑马程序员-----java基础(多线程)

来源:互联网 发布:linux查看目录 编辑:程序博客网 时间:2024/05/29 12:38

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

多线程

指应用程序有多条执行路径

进程:正在运行的应用程序

线程:一个进程的执行路径

如何实现多线程程序由于线程依赖于进程存在,而进程是操作系统创建的,并在java是不能直接调用系统的功能,为了方便对多线程提供了线程API的对应类。

线程类 Thread

创建线程的方式有两种;

方式1:继承Thread类,

1定义一个类继承Thread

2子类要重写Thread类的run()方法

3让线程启动并执行。 不能使用run方法,必须用start方法

Start方法作用:

1让线程启动

2调用run方法

线程和进程的联系

1进程包含多个线程

2进程一定至少包含一个线程

为什么使用线程,以及什么时候使用。

为了提高效率才使用,只有当擦做代码内容比较多,循环次数较多,这样的情况才使用。

程序的执行,是在抢占CPU资源,CPU是在多个程序间做高效切换。CPU再同一时刻,只能

处理一个程序。

方式2

1创建一个类,实现Runnable接口

2重写run方法

3创建类的实例

4把类的实现作为Thread的构造参数传递,创建Thread对象。

既然有了继承Thread类方法,为什么还有实现Runnable接口方式呢?

1避免了单继承的局限性

2实现接口方式,只创建了一个资源对象,更好的实现了数据,操作的分离

一般选择第二种方式。

线程的生命周期

新建

就绪

运行

阻塞

死亡

2015年09月26日 - 若你喜欢怪人 - 若你喜欢怪人的博客

  

线程安全问题

:为什么有问题

1:有共享数据

2:共享数据被多条语句操作

3:在多线程环境中

解决方案

1:同步代码块

synchronized(锁对象)

{

被同步的代码

}

1:同步方法

synchronized加在方法上。

死锁

  当同步中嵌套同步时,就有可能出现死锁现象。

public class DieLock extends Thread {private boolean flag;public DieLock(boolean flag) {this.flag = flag;}@Overridepublic void run() {if (flag) {synchronized (MyLock.objA) { System.out.println("true -- objA");synchronized (MyLock.objB) {System.out.println("true -- objB");}}} else {synchronized (MyLock.objB) {System.out.println("false -- objB");synchronized (MyLock.objA) {System.out.println("false -- objA");}}}} }


线程间通信

        其实就是多个线程在操作同一个资源,但是操作的动作不同。

 1wait(),notify(),notifyAll(),用来操作线程为什么定义在了Object类中?

                1,这些方法存在与同步中。

                2,使用这些方法时必须要标识所属的同步的锁。同一个锁上wait的线程,只可以被同一个锁上的notify唤醒。

                3,锁可以是任意对象,所以任意对象调用的方法一定定义Object类中。

        wait(),sleep()有什么区别?

              wait():释放cpu执行权,释放锁。

              sleep():释放cpu执行权,不释放锁。

setDaemo方法

设置守护线程,一旦主线程结束,守护线程就结束。

join方法

        A线程执行到了b线程的.join()方法时,A线程就会等待,等B线程都执行完,A线程才会执行。(此时B和其他线程交替运行。)join可以用来临时加入线程执行。

setPriority()方法用来设置优先级

        MAX_PRIORITY 最高优先级10

        MIN_PRIORITY   最低优先级1

        NORM_PRIORITY 分配给线程的默认优先级

yield()方法可以暂停当前线程,让其他线程执行。

0 0
原创粉丝点击