黑马程序员日记13----多线程

来源:互联网 发布:windows错误恢复 编辑:程序博客网 时间:2024/05/17 08:19

---------------------android培训java培训、期待与您交流! ----------------------


1:多线程
(1)多线程
  进程:正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。
  线程:其实就是进程中一个程序执行控制单元,一条执行路径。进程负责的是应用程序的空间的标示。线程负责的是应用程序的执行顺序。
 

  一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区、自己的变量。


(2)jvm启动是多线程的吗?
           jvm在启动的时,首先有一个主线程,负责程序的执行,调用的是main函数。主线程执行的代码都在main方法中。
           当产生垃圾时,收垃圾的动作,是不需要主线程来完成,因为这样,会出现主线程中的代码执行会停止,会去运行垃圾回收器代码,效率较低,所以由单独一个线程来负责垃圾回收。
 
(3)如果实现多线程呢?
A:继承Thread类
步骤:
**定义一个类,继承Thread类
**重写run方法
**调用start方法.
**启动线程
**调用run方法


Thread类中的常用方法:
**Thread(String name):通过构造给线程起名字
**setName(String name):通过set方法给线程起名字
**getName():获取线程的名称
**currentThread():获取当前线程的一个对象引用
***获取哪些没有直接继续Thread类的线程名称


B:实现Runnable接口
步骤:
**定义一个类,实现Runnable接口
**重写run方法
**创建实现了Runnable接口的子类对象,并把该对象作为参数传递给
 Thread类的对象.这个时候,调用Thread类的start方法.
(4)线程的生命周期
A:创建
B:就绪
C:运行
D:阻塞 sleep,wait导致阻塞
sleep的时间到了,wait的被唤醒了.就到了就绪状态
E:死亡
(5)卖票的问题
A:继承Thread实现卖票
这个时候,我们的票需要定义为静态的.但是呢,我们不建议这样做.
B:实现Runnable接口卖票
在这里,我们就发现卖票除了问题.(线程安全问题)


线程安全问题怎么产生的?
**多个线程延迟访问
**线程的随机性
(6)解决线程安全问题
A:同步代码块
格式: synchronized(对象)
     {
//被同步的代码,也就是可能出现安全问题的代码
     }
B:同步方法
就是在方法上加synchronized关键字即可.
C:同步的前提:
**同步需要两个或者两个以上的线程
**多个线程使用的是同一个锁。
未满足这两个条件,不能称其为同步。
D:同步的弊端:
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,
无形中会降低程序的运行效率。


同步可能造成死锁问题:
死锁的产生:
你拿着我们的锁,我拿着你的锁,谁都不先对方用.
举例:吃饭,西餐(刀和叉)
A:有两个刀
B:有两个叉
针对程序来说,就是我想用你的锁,而你也想用我的锁.都不放手.导致了死锁.
用代码实现一下死锁.


解决死锁的方式:不写这样的代码就可以.






单例的安全问题:
class Student
{
private Student(){}


private static Student s = null;


public static Student getInstance()
{
if(s==null)  //t1,t2,t3,t4
{
//如果进来了就创建了多个对象.不满足单例的要求.
s = new Student();
}
return s;
}
}




}


---------------------android培训java培训、期待与您交流! ----------------------

原创粉丝点击