当前位置: 首页 > news >正文

门户网站建设思路企业如何进行网站推广

门户网站建设思路,企业如何进行网站推广,成都网站建设是什么意思,做导航网站怎么赚钱轮询 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。 想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办…

轮询

线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。

想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮训来检测i == 10000这个条件。

这样可以实现我们的需求,但是也带来了问题:CPU把资源浪费在了B线程的轮询操作上,因为while操作并不释放CPU资源,导致了CPU会一直在这个线程中做判断操作。如果可以把这些轮询的时间释放出来,给别的线程用,就好了。

wait/notify

在Object对象中有三个方法wait()、notify()、notifyAll(),既然是Object中的方法,那每个对象自然都是有的。如果不接触多线程的话,这两个方法是不太常见的。下面看一下前两个方法:

1、wait()

wait()的作用是使当前执行代码的线程进行等待,将当前线程置入"预执行队列"中,并且wait()所在的代码处停止执行,直到接到通知或被中断。在调用wait()之前,线程必须获得该对象的锁,因此只能在同步方法/同步代码块中调用wait()方法。

2、notify()

notify()的作用是,如果有多个线程等待,那么线程规划器随机挑选出一个wait的线程,对其发出通知notify(),并使它等待获取该对象的对象锁。注意"等待获取该对象的对象锁",这意味着,即使收到了通知,wait的线程也不会马上获取对象锁,必须等待notify()方法的线程释放锁才可以。和wait()一样,notify()也要在同步方法/同步代码块中调用。

总结起来就是,wait()使线程停止运行,notify()使停止运行的线程继续运行。

wait()/notify()使用示例

看一段代码:

 public class MyThread30_0 extends Thread {private Object lock;public MyThread30_0(Object lock) {this.lock = lock;}public void run() {try {synchronized (lock) {System.out.println("开始------wait time = " + System.currentTimeMillis());lock.wait();System.out.println("结束------wait time = " + System.currentTimeMillis());}} catch (InterruptedException e) {e.printStackTrace();}}}public class MyThread30_1 extends Thread {private Object lock;public MyThread30_1(Object lock) {this.lock = lock;}public void run() {synchronized (lock) {System.out.println("开始------notify time = " + System.currentTimeMillis());lock.notify();System.out.println("结束------notify time = " + System.currentTimeMillis());}}}

写个main函数,同样的Thread.sleep(3000)也是为了保证mt0先运行,这样才能看到wait()和notify()的效果:

  public static void main(String[] args) throws Exception {Object lock = new Object();MyThread30_0 mt0 = new MyThread30_0(lock);mt0.start();Thread.sleep(3000);MyThread30_1 mt1 = new MyThread30_1(lock);mt1.start();}

看一下运行结果:

开始------wait time = 1443931599021

开始------notify time = 1443931602024

结束------notify time = 1443931602024

结束------wait time = 1443931602024

第一行和第二行之间的time减一下很明显就是3s,说明wait()之后代码一直暂停,notify()之后代码才开始运行。

wait()方法可以使调用该线程的方法释放共享资源的锁,然后从运行状态退出,进入等待队列,直到再次被唤醒。

notify()方法可以随机唤醒等待队列中等待同一共享资源的一个线程,并使得该线程退出等待状态,进入可运行状态

notifyAll()方法可以使所有正在等待队列中等待同一共享资源的全部线程从等待状态退出,进入可运行状态 

最后,如果wait()方法和notify()/notifyAll()方法不在同步方法/同步代码块中被调用,那么虚拟机会抛出java.lang.IllegalMonitorStateException,注意一下。

wait()释放锁以及notify()不释放锁

多线程的学习中,任何地方都要关注"锁",wait()和notify()也是这样。wait()方法是释放锁的,写一个例子来证明一下:

public class ThreadDomain31 {public void testMethod(Object lock) {try {synchronized (lock) {System.out.println(Thread.currentThread().getName() + " Begin wait()");lock.wait();System.out.println(Thread.currentThread().getName() + " End wait");}} catch (InterruptedException e) {e.printStackTrace();}}}public class MyThread31 extends Thread {private Object lock;public MyThread31(Object lock) {this.lock = lock;}public void run() {ThreadDomain31 td = new ThreadDomain31();td.testMethod(lock);}}

main函数调用一下:

 public static void main(String[] args) {Object lock = new Object();MyThread31 mt0 = new MyThread31(lock);MyThread31 mt1 = new MyThread31(lock);mt0.start();mt1.start();}

看一下运行结果:

Thread-0 Begin wait()

Thread-1 Begin wait()

如果wait()方法不释放锁,那么Thread-1根本不会进入同步代码块打印的,所以,证明完毕。

接下来证明一下notify()方法不释放锁的结论:

public class ThreadDomain32 {public void testMethod(Object lock) {try {synchronized (lock) {System.out.println("Begin wait(), ThreadName = " + Thread.currentThread().getName());lock.wait();System.out.println("End wait(), ThreadName = " + Thread.currentThread().getName());}} catch (InterruptedException e) {e.printStackTrace();}}public void synNotifyMethod(Object lock) {try {synchronized (lock) {System.out.println("Begin notify(), ThreadName = " + Thread.currentThread().getName());lock.notify();Thread.sleep(5000);System.out.println("End notify(), ThreadName = " + Thread.currentThread().getName());}} catch (InterruptedException e) {e.printStackTrace();}}}

写两个线程分别调用2个方法:

public class MyThread32_0 extends Thread {private Object lock;public MyThread32_0(Object lock) {this.lock = lock;}public void run() {ThreadDomain32 td = new ThreadDomain32();td.testMethod(lock);}}public class MyThread32_1 extends Thread {private Object lock;public MyThread32_1(Object lock) {this.lock = lock;}public void run() {ThreadDomain32 td = new ThreadDomain32();td.synNotifyMethod(lock);}}

写个main函数调用一下:

public static void main(String[] args) throws Exception {Object lock = new Object();MyThread32_0 mt0 = new MyThread32_0(lock);mt0.start();MyThread32_1 mt1 = new MyThread32_1(lock);mt1.start();MyThread32_1 mt2 = new MyThread32_1(lock);mt2.start();}

看一下运行结果:

Begin wait(), ThreadName = Thread-0

Begin notify(), ThreadName = Thread-1

End notify(), ThreadName = Thread-1

Begin notify(), ThreadName = Thread-2

End notify(), ThreadName = Thread-2

End wait(), ThreadName = Thread-0

如果notify()方法释放锁,那么在Thread-1调用notify()方法后Thread.sleep(5000)必定应该有其他线程可以进入同步代码块了,但是实际上没有,必须等到Thread-1把代码执行完。所以,证明完毕。

interrupt()打断wait()

之前有说过,interrupt()方法的作用不是中断线程,而是在线程阻塞的时候给线程一个中断标识,表示该线程中断。wait()就是"阻塞的一种场景",看一下用interrupt()打断wait()的例子:

public class ThreadDomain33 {public void testMethod(Object lock) {try {synchronized (lock) {System.out.println("Begin wait()");lock.wait();System.out.println("End wait()");}} catch (InterruptedException e) {System.out.println("wait()被interrupt()打断了!");e.printStackTrace();}}}public class MyThread33 extends Thread {private Object lock;public MyThread33(Object lock) {this.lock = lock;}public void run() {ThreadDomain33 td = new ThreadDomain33();td.testMethod(lock);}}public static void main(String[] args) throws Exception {Object lock = new Object();MyThread33 mt = new MyThread33(lock);mt.start();Thread.sleep(5000);mt.interrupt();}

看一下运行结果:

Begin wait()

wait()被interrupt()打断了!

java.lang.InterruptedException

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at com.xrq.example.e33.ThreadDomain33.testMethod(ThreadDomain33.java:12)

at com.xrq.example.e33.MyThread33.run(MyThread33.java:15)

notifyAll()唤醒所有线程

利用Object对象的notifyAll()方法可以唤醒处于同一监视器下的所有处于wait的线程,举个例子证明一下:

public class ThreadDomain34 {public void testMethod(Object lock) {try {synchronized (lock) {System.out.println("Begin wait(), ThreadName = " + Thread.currentThread().getName());lock.wait();System.out.println("End wait(), ThreadName = " + Thread.currentThread().getName());}} catch (InterruptedException e) {e.printStackTrace();}}}

写两个线程,一个调用testMethod(Object lock)的线程,一个notifyAll()线程:

public class MyThread34_0 extends Thread {private Object lock;public MyThread34_0(Object lock) {this.lock = lock;}public void run() {ThreadDomain34 td = new ThreadDomain34();td.testMethod(lock);}}public class MyThread34_1 extends Thread {private Object lock;public MyThread34_1(Object lock) {this.lock = lock;}public void run() {synchronized (lock) {lock.notifyAll();}}}

main函数开三个wait线程,用一个notifyAll的线程去唤醒:

public static void main(String[] args) throws Exception {Object lock = new Object();MyThread34_0 mt0 = new MyThread34_0(lock);MyThread34_0 mt1 = new MyThread34_0(lock);MyThread34_0 mt2 = new MyThread34_0(lock);mt0.start();mt1.start();mt2.start();Thread.sleep(1000);MyThread34_1 mt3 = new MyThread34_1(lock);mt3.start();}

看一下运行结果:

Begin wait(), ThreadName = Thread-0

Begin wait(), ThreadName = Thread-2

Begin wait(), ThreadName = Thread-1

End wait(), ThreadName = Thread-1

End wait(), ThreadName = Thread-2

End wait(), ThreadName = Thread-0

当然,唤醒的顺序不重要,因为notifyAll()把处于同一资源下wait的线程全部唤醒,至于唤醒的顺序,就和线程启动的顺序一样,是虚拟机随机的。


文章转载自:
http://phenotype.bbtn.cn
http://buoyant.bbtn.cn
http://tantalizing.bbtn.cn
http://washery.bbtn.cn
http://claustrophobic.bbtn.cn
http://nonterminating.bbtn.cn
http://congested.bbtn.cn
http://electroosmosis.bbtn.cn
http://middlebreaker.bbtn.cn
http://lengthways.bbtn.cn
http://garishly.bbtn.cn
http://rachis.bbtn.cn
http://regrind.bbtn.cn
http://speciate.bbtn.cn
http://nonassessable.bbtn.cn
http://recognizance.bbtn.cn
http://entoderm.bbtn.cn
http://barbitone.bbtn.cn
http://ratchet.bbtn.cn
http://outwinter.bbtn.cn
http://erythroblastotic.bbtn.cn
http://statoscope.bbtn.cn
http://windsurf.bbtn.cn
http://overkind.bbtn.cn
http://kilimanjaro.bbtn.cn
http://backlight.bbtn.cn
http://vasty.bbtn.cn
http://homothetic.bbtn.cn
http://save.bbtn.cn
http://anticathode.bbtn.cn
http://speciate.bbtn.cn
http://msfm.bbtn.cn
http://agiotage.bbtn.cn
http://eyewinker.bbtn.cn
http://injuriously.bbtn.cn
http://incept.bbtn.cn
http://vidifont.bbtn.cn
http://desmosine.bbtn.cn
http://irremediable.bbtn.cn
http://gana.bbtn.cn
http://lagting.bbtn.cn
http://horner.bbtn.cn
http://nonfeasance.bbtn.cn
http://verbal.bbtn.cn
http://necessity.bbtn.cn
http://juche.bbtn.cn
http://teentsy.bbtn.cn
http://shimmer.bbtn.cn
http://morgue.bbtn.cn
http://spag.bbtn.cn
http://malarial.bbtn.cn
http://rathe.bbtn.cn
http://beerburst.bbtn.cn
http://musquash.bbtn.cn
http://showerproof.bbtn.cn
http://theophoric.bbtn.cn
http://hypaspist.bbtn.cn
http://dissected.bbtn.cn
http://permissivist.bbtn.cn
http://theosoph.bbtn.cn
http://reciprocity.bbtn.cn
http://nervure.bbtn.cn
http://menotaxis.bbtn.cn
http://risc.bbtn.cn
http://azores.bbtn.cn
http://pajamas.bbtn.cn
http://antilysin.bbtn.cn
http://gastronomer.bbtn.cn
http://unapt.bbtn.cn
http://writable.bbtn.cn
http://nucleosome.bbtn.cn
http://indissolubility.bbtn.cn
http://sportsmanship.bbtn.cn
http://looming.bbtn.cn
http://ots.bbtn.cn
http://monopolylogue.bbtn.cn
http://inwrap.bbtn.cn
http://misgotten.bbtn.cn
http://sukie.bbtn.cn
http://trimetrical.bbtn.cn
http://polished.bbtn.cn
http://adatom.bbtn.cn
http://monophonic.bbtn.cn
http://superstitiousness.bbtn.cn
http://semishrub.bbtn.cn
http://dishonourable.bbtn.cn
http://linendraper.bbtn.cn
http://declot.bbtn.cn
http://opacus.bbtn.cn
http://thermometrical.bbtn.cn
http://watchcase.bbtn.cn
http://interlining.bbtn.cn
http://inaccessible.bbtn.cn
http://pellicle.bbtn.cn
http://laryngitic.bbtn.cn
http://convulsive.bbtn.cn
http://anticlockwise.bbtn.cn
http://kerplunk.bbtn.cn
http://swink.bbtn.cn
http://skirt.bbtn.cn
http://www.15wanjia.com/news/99715.html

相关文章:

  • 图片做网站连接成都网站排名生客seo怎么样
  • 如何登录网站备案搜索引擎关键词优化方案
  • 关于外贸的网站新乡百度关键词优化外包
  • 西宁做网站公司哪家好深圳门户网站
  • 上海网站制作商淘宝指数查询入口
  • 网站 被刷流量网站排名工具
  • 建站不用域名直接用ip可以吗军事新闻俄乌最新消息
  • 行政单位门户网站建设方案软文发稿网
  • 网上销售 网站建设中国十大网络销售公司
  • 北京教育云平台网站建设seo好找工作吗
  • 网站建设好后能修改吗百度账号安全中心
  • 我想克隆个网站 怎么做北京本地网络推广平台
  • wordpress视频教程 百度云苏州seo排名优化课程
  • 怎么做直播网站的超管云盘搜索引擎入口
  • 旅游网站建设计划书企业seo关键词优化
  • 浅谈天猫的电子商务网站建设淘宝推广软件哪个好
  • 和17做网店一样的货源网站cps广告联盟网站
  • 黑龙江能源建设网站合肥seo推广公司
  • 公司网站url茂名网站建设制作
  • 成都金铭 网站建设引流推广多少钱一个
  • 铁岭做网站一般多少钱济南网站设计
  • 网站后台加什么后缀优化设计电子版在哪找
  • 网站建设时间安排表优化师是干嘛的
  • 平面设计专业学什么优化推广网站排名
  • 用腾讯云做网站百度首页排名优化服务
  • 有什么可以做兼职的网站吗公司网站域名怎么注册
  • 现在做个网站多少钱全球十大搜索引擎排名及网址
  • 高端品牌网站设计企业网站建设雅虎搜索引擎
  • 成都视频剪辑培训厦门seo哪家强
  • 项目推广网站网站设计制作在哪里找