黑马程序员---Java基础总结--多线程

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

进程是一个正在执行中的程序,每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。

线程是进程中的一个独立控制单元。线程控制着进程的执行。
java JVM启动时会有一个进程java.exe。jvm启动时候启动也不止一个线程,还有负责垃圾回收机制的线程。
创建线程的方法,继承Thread类 ,重写run方法。调用线程的start方法(启动线程和调用run方法两个作用)。创建线程的另一个方法:实现Runnable接口,步骤:1、定义类实现Runnable接口,2、覆盖Runnable接口中的run方法。3、通过Tread类创建线程对象。4、将Runnable接口子类对象作为实际参数传递给Thread类的构造函数。5、调用Thread类的start方法开启线程并调用Runnable接口的run方法。
实现方式和继承方式的区别:实现方式避免了单继承的局限性。多用实现方式。继承thread:线程代码存在Thread子类的run方法中。实现Runnable,线程代码存在接口的子类的类方法中。
多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。
Thread类用于描述线程。该类就定义了一个功能,用于存储线程要运行的代码。该存储方法就是run方法。
start方法开启线程并执行该线程的run方法。run方法只是执行该线程的run方法,线程并没有运行。
线程的四种状态:被创建、————(start())运行、——————(sleep(time)&&wait())冻结(睡眠)、消亡。临时状态:阻塞(具备运行资格、但没有执行权)
使用thread中的getName方法获取线程的名称。使用setName修改线程的名称。也可以在创建现成的时候直接定义名称。static thread currentThread():获取当前线程对象。
多线程的安全问题:当多条语句在操作同一个现成的共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。(卖票出现0、-1等错票)。解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行。java使用同步代码块解决这个问题。synchronized(对象){需要被同步的代码}
同步代码块如同锁,持有锁的线程可以再同步中执行。没有持有锁的线程技术获取cpu的执行权,也进不去,因为没有获取锁。
同步的前提:必须有两个或者两个以上的线程。必须是多个线程使用同一个锁。
同步函数:可以对函数进行同步,但是要注意哪些代码需要被同步。同步函数需要被对象调用,那么函数都有一个所属对象的引用。就是this.所以同步函数使用的锁是this。静态同步函数使用的锁是该方法所在类的字节码文件对象:类名.class
懒汉式的单例设计模式:代码如下:
class Single
{
private static Singele s=null;
private Single(){}


public static Single getInstance()
{
if(s==null)//节省空间,减少对锁的判断。
{
sychronized(Single.class)//同步代码块。
{
if(s==null)
s=new Single();
}
}
return s;
}
}
同步中嵌套同步,锁不一样容易产生死锁。
线程间通信:其实就是多个线程在操作同一个资源,但是操作的动作不同。
等待唤醒机制:等待线程都存在线程池里面。唤醒时一般唤醒第一个等待的线程。notifyAll();唤醒所有线形池里面的所以线程。wait()和notify()、notifyAll()必须用着同步里面,因为要对持有监视器(锁)的线程操作。notify()、notifyAll()只能唤醒同一个锁的wait();
jdk1.5有提供了多线程的升级解决方案:将同步Synchronized替换成现实Lock操作。将Object中的wait,notify notifyAll替换了 Condition对象。该对象可以lock锁进行获取。一个锁可以对应多个condition对象,在唤醒机制中可以更好地操作线程。
停止线程:stop方法已经过时。可以使用run方法结束,便停止了线程。一般多线程运行,都是循环结构,只要控制住循环,就可以让run方法结束,也就是线程结束。特殊情况:当线程处于冻结状态,就不会读取到标记,线程就不会结束,当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。强制让线程恢复到运行状态中来,使用interrupt方法。
守护线程和用户线程:如果线程都是守护线程时,JVM退出。可以理解为后台线程。再启动线程前使用。
join:当A线程执行到了B线程的join 方法时,那么A线程就会等待B线程执行完,再去执行A线程。抢夺cpu执行权。

线程的优先级默认为5,总共有10个优先级。

补充:单例设计模式:

单例设计模式:解决一个类在内存只存在一个对象。在主函数调用的时候,不要使用new方法,使用Single s1=Single.getInstance();
class Single//饿汉式:Single类一进入内存,就已经创建好了对象。建议开发使用此模式。
{
private Single(){}//将构造函数私有化
private static Single s=new Single();//在类中创建一个本类对象。
public static Single getInstance()//提供一个方法获取该对象。
{
return s;
}


}

对于事物该怎么描述,还怎么描述。当需要将该事物的对象保证在内存唯一时,只要将上述代码加入进去即可。
单例设计模式第二种写法:
class Single//延时加载,懒汉式:Single类进入内存,对象还没有存在,只有调用了getInstance方法               时,才创立对象。
{
private static single s=null;
private single(){}
public static Single getInstance()
{
if(s==null)
  s=new Single();
  return s;
}
}


懒汉式在多线程时使用以下:
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s=new Single();
}
}
return s;
}
}

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

详细请查看:http://edu.csdn.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值