------- android培训、java培训、期待与您交流! ----------
1:多线程(重点)
(1)多线程
A:进程:正在运行的程序,代表的是应用程序在内存中的执行区域。
B:线程:线程是进行的执行单元,执行路径。
C:任何一个应用程序,都至少有一条执行路径。
D:单线程程序:应用程序只有一条执行路径。
E:多线程程序:应用程序有多条执行路径。
(2)jvm启动的时候,是单线程的还是多线程的?
是多线程的。
假如jvm的启动时单线程的,那么,在程序的运行过程中,就可能存在着
内存溢出的隐患。不可能等到内存溢出了,在去进行垃圾回收。所以,jvm
启动是多线程的。至少有两个,主线程和垃圾回收线程。
(3)java中实现多线程的方式
A:继承Thread类
步骤:
**自定义类继承Thread类
**重写run方法
**创建自定义类的对象
**调用start方法
代码体现:
public class ThreadDemo extends Thread
{
public void run()
{
//code
}
}
public class ThreadDemoTest
{
public static void main(String[] args)
{
ThreadDemo td1 = new ThreadDemo();
ThreadDemo td2 = new ThreadDemo();
td1.start();
td2.start();
}
}
B:实现Runnable接口
步骤:
**创建自定义类实现Runnable接口
**在自定义类中实现Runnable接口中的run方法
**创建自定义类对象,并把该对象作为参数传递给
Thread类的构造方法来创建Thread的对象
**调用start方法
代码体现:
public class RunnableDemo implements Runnable
{
public void run()
{
//code
}
}
public class RunnableDemoTest
{
public static void main(String[] args)
{
RunnableDemo rd = new RunnableDemo();
Thread t1 = new Thread(rd);
Thread t2 = new Thread(rd);
t1.start();
t2.start();
}
}
(4)Thread类中的常用的几个小方法
A:String getName():获取线程的名称
B:static Thread currentThread():获取当前线程的对象的引用
用于不是Thread类的子类获取线程对象的名称。
格式:Thread.currentThread().getName();
C:void setName(String name):通过set方法设置线程对象的名称。
D:Thread(String name):通过构造方法设置线程对象的名称。
(5)线程的随机性原理
CPU的特点:在同一时刻,只能有一个线程执行。
所以,多个线程其实是在抢占CPU的资源。而CPU呢,却是在这些线程中做着高速的切换。
(6)线程的生命周期和在生命周期中各个状态的特点
新建:当一个线程对象被创建,但是没有开启,这个时候,只是对象线程对象开辟了
内存空间和初始化数据。
就绪:新建的对象调用start方法,就到了就绪状态。
在这个状态的线程对象,具有执行资格,没有执行权。
运行:当线程对象获取到了CPU的资源。
在这个状态的线程对象,具有执行资格,也具有执行权。
阻塞:运行过程中的线程由于某些原因(比如wait,sleep),释放了执行权和执行资格。
当然,他们可以回到运行状态。只不过,不是直接回到。
而是先回到就绪状态。
死亡:当线程对象调用的run方法结束,或者直接调用stop方法,就让线程对象死亡,
在内存中变成了垃圾。
2:线程同步(重点)
(1)产生线程安全的原因
A:多个线程访问出现延迟。
B:线程访问的随机性
注:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的。
(2)如果判断一个线程程序有没有安全问题呢?
A:多个线程操作共享数据
B:这个操作是分多条语句执行的。
(3)解决线程安全问题的方式
A:同步代码块
B:格式:
synchronized(对象)
{
//需要被同步的代码
}
(4)同步代码块问题:
A:同步代码块的锁是任意同一对象。
B:当你发现你把某个程序加了同步后,还没有解决线程安全问题。
这个时候,你需要考虑你使用的是否是同一把锁(对象);