天天看点

黑马程序员-学习日志-多线程

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

1、如何在自定义的代码中,只定义一个线程?

 通过对api的查找,java已经提供了对线程这类事物的描述。就是Thread类。

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

步骤:

1、定义类继承Thread。

2、复写Thread类中的run方法。

3、调用线程的start方法,

   该方法两个作用:启动线程,调用run方法。

发现运行结果每一次都不同。

因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。

明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)

cpu在做着快速的切换,以达到看上去是同时运行的结果。

多线程的一个特性:随机性。谁抢到谁执行,至于执行多长时间,cpu说的算。

二 创建线程的第二种方式:

1,定义类实现Runnable接口

2,覆盖Runnable接口中的run方法。

   将线程要运行的代码存放在该run方法中。

3, 通过Thread类建立线程对象。

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

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

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

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

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

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

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

在定义线程时,建议使用实现方法。

两种方式区别:

继承Thread:线程代码存在Thread子类run方法中。

实现Runnable:线程代码存在接口的子类的run方法。

Java对于多线程的安全问题提供了专业的解决方式——同步代码块

synchronized(对象)

{

需要被同步的代码

}

其中对象如同锁。持有锁的线程可以在同步中执行。

没有持有锁的线程即可以获取cpu的执行权,也进不去,因为没有获取获取锁。

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

好处:解决了多线程的安全问题。

弊端:多个线程需要判断锁,较为消耗资源。

多线程如何找问题:

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

2,明确共享数据。

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

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

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

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

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

通过验证,发现不再是this。因为静态方法中不可以定义this。

静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。

类名.class  该对象的类型是class。

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

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net

继续阅读