读书人

黑马软件工程师_Java多线程知识点

发布时间: 2012-10-07 17:28:51 作者: rapoo

黑马程序员_Java多线程知识点.

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

?

?

?

?

因为自定义的run方法所属的对象是Runnable接口的子类对象.所以要让线程去指定指定对象的run方法.就必须明确该run方法所属对象.

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

?

线程由两种实现方式:

第一种方式:

classMyThread extends Thread{

?? public void run(){

?? 需要进行执行的代码,如循环。

}

}

?

publicclass TestThread{

? main(){

?? Thread t1=new Mythread();

?? T1.start();

}

}

?

只有等到所有的线程全部结束之后,进程才退出。

?

第二种方式:

ClassMyThread? implements Runnable{

? Public?void run(){

}

?

? MyThread target=new MyThread();

? Thread t3=new Thread(target);

? Thread.start();//启动线程

?

实现方式和继承方式的区别:

实现方式好处:避免了单继承的局限性,在定义线程时,建议使用实现方式.

?

解决多线程运行的安全问题,用同步代码块(需要锁). 也可以同步函数.

synchronized(对象)

{

?????? 需要被同步的代码

}

同步的前提:

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

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

?

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

?

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

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

单例设计模式懒汉式的同步,该同步所使用的锁是该类的字节码文件.

?

多线程死锁的发生.简单举例二个线程互相要对方的锁能造成死锁.

?

多线程,线程间的通讯

wait:

notify();

notifyAll();

都使用在同步中,因为要对持有监视器(锁)的线程操作.

所以要使用在同步中,因为只有同步才具有锁.

?

为什么这些操作线程的方法要定义在object类中呢?

因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒.不可以对不同锁中的线程进行唤醒.

也就是说等待和唤醒必须是同一个锁.

而锁可以是任意对象,所以可以被任意对象调用的方法定义在 object中.

?

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。

?

JDK1.5后的线程间通讯新特性

作为一个示例,假定有一个绑定的缓冲区,它支持 put 和 take 方法。如果试图在空的缓冲区上执行 take 操作,则在某一个项变得可用之前,线程将一直阻塞;如果试图在满的缓冲区上执行 put 操作,则在有空间变得可用之前,线程将一直阻塞。我们喜欢在单独的等待 set 中保存 put 线程和 take 线程,这样就可以在缓冲区中的项或空间变得可用时利用最佳规划,一次只通知一个线程。可以使用两个 Condition 实例来做到这一点。

?class BoundedBuffer {

?? final Lock lock = new ReentrantLock();

??final Condition notFull? = lock.newCondition();

??final Condition notEmpty = lock.newCondition();

?

??final Object[] items = new Object[100];

??int putptr, takeptr, count;

?

??public void put(Object x) throws InterruptedException {

???? lock.lock();

???? try {

??????while (count == items.length)

????????notFull.await();

??????items[putptr] = x;

??????if (++putptr == items.length) putptr = 0;

??????++count;

??????notEmpty.signal();

???? } finally {

?????? lock.unlock();

???? }

?? }

?

??public Object take() throws InterruptedException {

???? lock.lock();

???? try {

??????while (count == 0)

????????notEmpty.await();

? ?????Object x = items[takeptr];

??????if (++takeptr == items.length) takeptr = 0;

??????--count;

??????notFull.signal();

??????return x;

???? } finally {

?????? lock.unlock();

???? }

?? }

?}

?

多线程,停止线程.

多线程运行的代码通常是循环结构,只要控制循环就可以让run方法结束,了就是线程结束.

?

守护线程

?Join方法.??xx.setDaemon(true);?

优先级Thread.yield();可以稍微减缓线程的运行.

?

?

?

?

?

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

读书人网 >编程

热点推荐