您的位置:首页 > 职场人生

黑马程序员_ 多线程

2014-03-17 09:32 183 查看

----------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------

/*

黑马程序员_ 多线程

进程:是一个正在执行中的程序

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

线程:就是进程中一个独立的控制单元

线程在控制着进程的执行

一个进程中至少有一个线程。

进程负责的是应用程序的空间的标示,线程负责的是应用程序的执行顺序

JVM 启动时会有一个进程java.exe

该进程中至少会有一个线程负责java程序的执行

而且该线程的运行代码存在于main方法中

该线程称之为主线程

扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程

随机性原理:

因为cpu的快速切换造成。多个线程都获取cpu的执行权,cpu执行到谁,谁就运行

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

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

这就是多线程的一个特性:随机性

返回当前线程的名称:Thread.currentThread().getName()

线程的名称是由:Thread-编号定义的。编号从0开始

线程要运行的代码都统一存放在了run方法中

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

步骤:

1定义类继承Thread

2复写Thread类中的run方法

目的:将自定义的代码存储在run方法中,让线程运行

3通过建立Thread类的子类对象,创建线程对象

4调用线程的start方法

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

为什么要覆盖run方法呢?

Thread类用于描述线程

该类就定义一个功能:用于存储线程要运行的代码。该存储功能就是run方法

也就是说Thread类中的run方法,用于存储线程要运行的代码

线程状态:

被创建:start()

运行:具备执行资格,同时具备执行权

冻结:sleep(time),wait()-notify()唤醒;线程释放了执行权,同时释放执行资格。

临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权

消亡:stop()

创建线程的第二种方法: 实现一个接口 Runnable

步骤:

1定义类实现Runnable接口

2覆盖接口中的run方法(用于封装线程要运行的代码)

3通过Thread类创建线程对象

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

为什么要传递呢?因为要让线程对象明确要运行的run方法所属的对象

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

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

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

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

实现thread:线程代码存放在接口的子类的run方法中

*/

class Ticket implements Runnable//extendsThread

{

privateint tick = 100;

publicvoid run()

{

while(true)

{

if(tick>0)

{

System.out.println(Thread.currentThread().getName()+"....sale:"+tick--);

}

}

}

}

class TicketDemo

{

publicstatic void main(String[] args)

{

Tickett = new Ticket();

Threadt1 = new Thread(t);

Threadt2 = new Thread(t);

Threadt3 = new Thread(t);

Threadt4 = new Thread(t);

t1.start();

t2.start();

t3.start();

t4.start();

/*

Tickett1 = new Ticket();

Tickett2 = new Ticket();

Tickett3 = new Ticket();

Tickett4 = new Ticket();

t1.start();

t2.start();

t3.start();

t4.start();

*/

}

}

同步代码块

/*

通过分析,发现,打印出0,-1,-2的错票问题

多线程的运行出现了安全问题

出现问题的原因:

当多线程在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完

另一个线程参与进来执行。导致共享数据的错误

解决方法:

对多条操作共享数据的语句。只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行

Java对于多线程的安全问题提供了专业的解决方式

就是同步代码块

synchronized(对象)

{

需要被同步的代码

}

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

没有锁的线程即使获取cpu的执行权,也进不去。

同步的前提:

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

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

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

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

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

*/

class Ticket implements Runnable//extendsThread

{

privateint tick = 1000;

Objectobj = new Object();

publicvoid run()

{

while(true)

{

synchronized(obj)

{

if(tick>0)

{

try{Thread.sleep(10);}

catch(Exceptione){}

System.out.println(Thread.currentThread().getName()+"....sale:"+tick--);

}

}

}

}

}

class TicketDemo

{

publicstatic void main(String[] args)

{

Tickett = new Ticket();

Threadt1 = new Thread(t);

Threadt2 = new Thread(t);

Threadt3 = new Thread(t);

Threadt4 = new Thread(t);

t1.start();

t2.start();

t3.start();

t4.start();

/*

Tickett1 = new Ticket();

Tickett2 = new Ticket();

Tickett3 = new Ticket();

Tickett4 = new Ticket();

t1.start();

t2.start();

t3.start();

t4.start();

*/

}

}

/*

同步的第二种表现形式:

同步函数:其实就是讲同步关键字定义在函数上,让函数具备了同步性

判断程序是否有安全问题

如何找到问题:

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

2明确共享数据

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

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

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

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

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

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

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

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

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

同步代码块和同步函数的区别?

同步代码块使用的锁可以是任意对象

同步函数使用的锁是this 静态同步函数的锁是该类的字节码文集对象

*/

考点问题:

当多线程访问懒汉式时,因为懒汉式的方法对共性数据进行多条语句的操作。所以容易出现安全问题。为了解决问题,加入同步机制,解决安全问题。但是却带来了效率降低。

为了效率问题,通过双重判断的形式解决

ClassSingle

{

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;

}

}

----------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: