Java(4)--多线程

来源:互联网 发布:linux查询jdk安装路径 编辑:程序博客网 时间:2024/06/15 22:40

首先要理解进程和线程之间的关系,进程是资源分配的最小单元,线程是执行的最小单元,一个进程可以有多个线程组成。

自定义一个线程  查找API文档  

java.lang.Thread类中

创建线程的第一个方式:继承Thread类       继承方式

1.定义类继承Thread类

2.复写Thread类中的run方法

3.调用线程中的start方法,该方法有两个作用,启动线程和执行run方法

如果创建对象后直接调用run方法而不去调用start方法,则该线程并没有被创建,仅仅是简单的调用方法,是单线程。


Thread.currenThread返回当前执行线程对象

创建线程的第二个方式:runnable接口     实现方式

1.定义实现Runnable接口

2.覆盖Runnable接口中的run方法      将线程要运行的代码存放在该方法中

3.通过Thread类建立线程对象

4.强Runnable接口的子类对象作为实际参数传递给Thread类的构造函数

为什么要Runnable接口的子类对象传递给Thread构造函数

因为自定义的run方法所属的对象是Runnable接口的子类对象

所以要线程去执行指定对象的run方法,就必须明确该run方法的所属对象

5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法


实现方式和继承方式有什么区别呢?

原因主要是由于java是单继承方式,不支持多继承 所以接口的提出一定程度上弥补了单继承的缺失,增强了代码的灵活性

实现方式的好处:避免了单继承的局限性

在定义线程时,建议使用实现方式 即增加接口

两种方式的区别:   代码存放位置不同

继承Thread:代码存放在Thread子类的run方法中

接口Runnable:代码存放在接口子类的run方法中



同步的前提

1.必须要有两个或者两个以上的线程

2.必须是多个线程同时使用一个锁

必须保证同步中只能有一个线程在运行

同步的好处是:解决了多线程的安全问题

弊端是:多个线程都需要判断锁是否锁上了,较为消耗资源(在允许范围之内)


如何找问题:

1.明确哪些代码是多线程运行代码

2.明确共享数据

3.明确多线程运行代码中哪些语句是操作共享数据的语句


synchronized   同步

同步函数用的是哪一个锁”

函数需要被对象调用,那么函数都有一个所属对象引用  就是this

所以同步函数使用的锁是this

如果同步函数时被静态修饰后,所用的锁是什么呢

不是this  因为静态方法中不可以定义this ,静态函数在进入内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象,即类名.class  该对象的类型是class

 静态的同步方法使用的锁是该方法所在类的字节码文件对象 即类名.class



单例模式中  恶汉式和懒汉式的不同:懒汉式的特点在于延时加载,懒汉式的延时加载会存在问题,如果多个线程访问时会出现安全问题,可以用同步解决


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

对于多个生产者和消费者。
为什么要定义while判断标记。
原因:让被唤醒的线程再一次判断标记。


为什么定义notifyAll,
因为需要唤醒对方线程。
因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待。


JDK1.5 中提供了多线程升级解决方案。
将同步Synchronized替换成现实Lock操作。
将Object中的wait,notify notifyAll,替换了Condition对象。
该对象可以Lock锁 进行获取。
该示例中,实现了本方只唤醒对方操作。

Lock:替代了Synchronized
lock 
unlock
newCondition()


Condition:替代了Object wait notify notifyAll
await();
signal();
signalAll();

join:
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。

join可以用来临时加入线程执行。

如何停止线程?
只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。

只要控制住循环,就可以让run方法结束,也就是线程结束。

特殊情况:
当线程处于了冻结状态。
就不会读取到标记。那么线程就不会结束。

当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。

Thread类提供该方法 interrupt();




0 0
原创粉丝点击