多线程的基础方法简介

  1. wait()和notify()、notifyAll()这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用。synchronized关键字用于保护共享数据,阻止其他线程对共享数据的存取,但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。这三个方法都是java.lang.Object的方法。

  2. Executor的中的线程池启动是由Executors的静态方法来创建,定义Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。ExecutorService提供管理终止的方法,可以跟踪一个或多个异步任务执行状况而生成Future方法。

  3. join方法 有两个线程a 和b 如果在a线程中调用了b.join()方法 则直到线程b执行完,才会执行a,既是说:join方法是把指定的线程加入到当前线程,将两个交替执行的线程合并为按序执行。

  4. yield方法,是放任线程执行,乐意让其它线程占用自己的位置,并不保证会产生这种效果,有时候是不受线程优先级的约束的。Yield是一个静态的原生(native)方法,Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。,Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态,它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态。

  5. ExecutorService的submit()与execute()的不同:A、接收的参数不同:submit方法接收Callable类型的任务,并将结果保存在future变量中,执行Callable的call()方法;execute接收的是Runnable类型的任务,执行Runnable的run()方法 B、submit有返回值,放在Future<Object>对象中;execute没有,C、submit方法更方便异常的处理。

  6. sleep、wait、yield,都是发生在多多线程的情况下,在程序调用处,产生线程阻塞,join也会,但是它只等到被加入线程执行结束。

    sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。

  7. yield()也不会释放锁标志。实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。

  8. sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程此时获取CPU占有权。在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。

    yield()只是使当前线程重新回到可执行状态,所有执行yield()的线程有可能在进入到可执行状态后马上又被执行,所以yield()方法只能使同优先级的线程有执行的机会。

 

第一种解释:

功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩.   

    

  还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.

第二种解释:

sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行,例如:

try{

System.out.println("I'm going to bed");

Thread.sleep(1000);

System.out.println("I wake up");

}

catch(IntrruptedException e) {

}

wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者,例如:

//Thread 1

try{

obj.wait();//suspend thread until obj.notify() is called

}

catch(InterrputedException e) {

}

 

第三种解释:

这两者的施加者是有本质区别的. 

sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.

而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行.

 

其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题

 

 在java.lang.Thread类中,提供了sleep(),

而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程

sleep()可以将一个线程睡眠,参数可以指定一个时间。

而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。

    wait有两种形式wait()和wait(milliseconds).

sleep和wait的区别有:

  1,这两个方法来自不同的类分别是Thread和Object

  2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

  3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在

    任何地方使用  

synchronized(x){

      x.notify()

     //或者wait()

   }

   4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值