java怎么让一个方法实现线程 java多线程怎样让一个线程睡眠

java\u591a\u7ebf\u7a0b\u6709\u51e0\u79cd\u5b9e\u73b0\u65b9\u6cd5

java\u4e2d\u5b9e\u73b0\u591a\u7ebf\u7a0b\u5e38\u7528\u7684\u65b9\u6cd5\u6709\u4ee5\u4e0b\u4e09\u79cd\uff1a
/** * \u65b9\u6cd5\u4e00\uff1a\u7ee7\u627fThread\u7c7b\uff0c\u91cd\u5199run\u65b9\u6cd5 * * @author qd * */public class MyThread extends Thread { @Override public void run() { super.run(); }}/** * \u65b9\u6cd5\u4e8c\uff1a\u5b9e\u73b0Runnable\u63a5\u53e3\uff0c\uff0c\u91cd\u5199run\u65b9\u6cd5 * * @author qd * */class MyThread1 implements Runnable { @Override public void run() { }}/** * \u65b9\u6cd5\u4e09\uff1a\u5b9e\u73b0Callable\u63a5\u53e3\uff0c\u91cd\u5199call\u65b9\u6cd5 * \u4f18\u70b9\uff1a\u53ef\u4ee5\u4f20\u53c2\u6570\uff0c\u6709\u8fd4\u56de\u503c\u7c7b\u578b\uff08\u53c2\u6570\u4e0e\u8fd4\u56de\u503c\u7c7b\u578b\u4e00\u81f4\uff09 * * @author qd * */class MyThread2 implements Callable { @Override public Integer call() throws Exception { return null; }}

\u53ef\u4ee5\u4f7f\u7528sleep()\u65b9\u6cd5\u3002
sleep()\u65b9\u6cd5\u62e5\u6709\u4e00\u4e2a\u53c2\u6570\uff0c\u5b83\u63a7\u5236\u7761\u7720\u7684\u957f\u77ed\uff0c\u4ee5\u6beb\u79d2\u8ba1\u7b97\u3002sleep()\u65b9\u6cd5\u4f1a\u629b\u51faInterruptedException\uff0c\u6240\u4ee5\u4e00\u5b9a\u5728try-catch\u5757\u91cc\u9762\u4f7f\u7528\u5b83\u3002
\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a
public class A implements Runnable{ int i = 0; public static void main(String[] args){ A a1 = new A(); A a2 = new A(); a1.run(); a2.run(); } public void run(){ while(++i <= 100){ System.out.println(i); try{ Thread.sleep(50); }catch(Exception e){ e.printStackTrace(); } } }}\u6ce8\u610f\uff0csleep()\u65b9\u6cd5\u5e76\u4e0d\u4fdd\u8bc1\u7ebf\u7a0b\u9192\u6765\u540e\u8fdb\u5165\u8fd0\u884c\uff0c\u53ea\u80fd\u4fdd\u8bc1\u5b83\u8fdb\u5165\u5c31\u7eea\u72b6\u6001\u3002

Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:
◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。

为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢?
在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。
还有一点最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享.
(1)通过扩展Thread类来创建多线程
假设一个影院有三个售票口,分别用于向儿童、成人和老人售票。影院为每个窗口放有100张电影票,分别是儿童票、成人票和老人票。三个窗口需要同时卖票,而现在只有一个售票员,这个售票员就相当于一个CPU,三个窗口就相当于三个线程。通过程序来看一看是如何创建这三个线程的。

public class MutliThreadDemo {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
m1.start();
m2.start();
m3.start();
}
}
class MutliThread extends Thread{
private int ticket=100;//每个线程都拥有100张票
MutliThread(String name){
super(name);//调用父类带参数的构造方法
}
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
}
}
}

程序中定义一个线程类,它扩展了Thread类。利用扩展的线程类在MutliThreadDemo类的主方法中创建了三个线程对象,并通过start()方法分别将它们启动。
从结果可以看到,每个线程分别对应100张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系,因此都有机会得到CPU的处理。但是结果显示这三个线程并不是依次交替执行,而是在三个线程同时被执行的情况下,有的线程被分配时间片的机会多,票被提前卖完,而有的线程被分配时间片的机会比较少,票迟一些卖完。
可见,利用扩展Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰。
(2)通过实现Runnable接口来创建多线程

public class MutliThreadDemo2 {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
Thread t1=new Thread(m1);
Thread t2=new Thread(m2);
Thread t3=new Thread(m3);
t1.start();
t2.start();
t3.start();
}
}
class MutliThread implements Runnable{
private int ticket=100;//每个线程都拥有100张票
private String name;
MutliThread(String name){
this.name=name;
}
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+name);
}
}
}

由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和(1)结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。

由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和例4.2.1的结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。
(3)通过实现Runnable接口来实现线程间的资源共享
现实中也存在这样的情况,比如模拟一个火车站的售票系统,假如当日从A地发往B地的火车票只有100张,且允许所有窗口卖这100张票,那么每一个窗口也相当于一个线程,但是这时和前面的例子不同之处就在于所有线程处理的资源是同一个资源,即100张车票。如果还用前面的方式来创建线程显然是无法实现的,这种情况该怎样处理呢?看下面这个程序,程序代码如下所示:

+ View Code
结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。
可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的,读者想想看,为什么?
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。

  • java 涓鏈夊嚑绉鏂规硶鍙互瀹炵幇涓涓嚎绋?鐢ㄤ粈涔堝叧閿瓧淇グ鍚屾鏂规硶? stop...
    绛旓細銆愮瓟妗堛戯細鏈変袱绉嶅疄鐜版柟娉曪紝鍒嗗埆浣跨敤new Thread()鍜宯ew Thread(runnable)褰㈠紡锛岀涓绉嶇洿鎺ヨ皟鐢 thread 鐨剅un 鏂规硶锛屾墍浠ワ紝鎴戜滑寰寰浣跨敤Thread 瀛愮被锛屽嵆new SubThread()銆傜浜岀璋 鐢╮unnable 鐨剅un 鏂规硶銆傛湁涓ょ瀹炵幇鏂规硶锛屽垎鍒槸缁ф壙Thread 绫讳笌瀹炵幇Runnable 鎺ュ彛 鐢╯ynchronized 鍏抽敭瀛椾慨楗板悓姝ユ柟娉 鍙嶅浣...
  • java涓疄鐜扮嚎绋鐨鏂规硶鏈夊摢浜
    绛旓細寮鍚嚎绋嬶細Thread t = new Thread(瀵硅薄)//鍒涘缓绾跨▼瀵硅薄 t.start()(3)瀹炵幇Callable鎺ュ彛锛岄噸鍐檆all鍑芥暟 Callable鏄被浼间簬Runnable鐨勬帴鍙o紝瀹炵幇Callable鎺ュ彛鐨勭被鍜屽疄鐜癛unnable鐨勭被閮芥槸鍙鍏跺畠绾跨▼鎵ц鐨勪换鍔°侰allable鍜孯unnable鏈夊嚑鐐逛笉鍚:鈶燙allable瑙勫畾鐨勬柟娉曟槸call()锛岃孯unnable瑙勫畾鐨勬柟娉曟槸run().鈶all...
  • java鎬庝箞瀹炵幇绾跨▼
    绛旓細1銆佺户鎵縏hread绫诲垱寤虹嚎绋 Thread绫绘湰璐ㄤ笂鏄疄鐜颁簡Runnable鎺ュ彛鐨勪竴涓疄渚嬶紝浠h〃涓涓嚎绋嬬殑瀹炰緥銆傚惎鍔ㄧ嚎绋嬬殑鍞竴鏂规硶灏辨槸閫氳繃Thread绫荤殑start()瀹炰緥鏂规硶銆俿tart()鏂规硶鏄竴涓猲ative鏂规硶锛屽畠灏嗗惎鍔ㄤ竴涓柊绾跨▼锛屽苟鎵цrun()鏂规硶銆傝繖绉嶆柟寮忓疄鐜板绾跨▼寰堢畝鍗曪紝閫氳繃鑷繁鐨勭被鐩存帴extend Thread锛屽苟澶嶅啓run()鏂规硶锛屽氨...
  • java鎬庝箞璁╀竴涓柟娉曞疄鐜扮嚎绋
    绛旓細鍋囪涓涓褰遍櫌鏈変笁涓敭绁ㄥ彛锛屽垎鍒敤浜庡悜鍎跨銆佹垚浜哄拰鑰佷汉鍞エ銆傚奖闄负姣忎釜绐楀彛鏀炬湁100寮犵數褰辩エ锛屽垎鍒槸鍎跨绁ㄣ佹垚浜虹エ鍜岃佷汉绁ㄣ備笁涓獥鍙i渶瑕佸悓鏃跺崠绁紝鑰岀幇鍦ㄥ彧鏈変竴涓敭绁ㄥ憳锛岃繖涓敭绁ㄥ憳灏辩浉褰撲簬涓涓狢PU锛屼笁涓獥鍙e氨鐩稿綋浜庝笁涓绾跨▼銆傞氳繃绋嬪簭鏉ョ湅涓鐪嬫槸濡備綍鍒涘缓杩欎笁涓嚎绋嬬殑銆俻ublic class MutliThreadDem...
  • java 瀹炵幇绾跨▼鐨鏂规硶
    绛旓細涓ょ鏂规 1.缁ф壙Thread绫 2.瀹炵幇Runnable鎺ュ彛 class MyThread extends Thread{ public void run(){ System.out.println(" extends thread");} } class MyThread2 implements Runnable{ public void run(){ System.out.println(" implements runnable");} } class Run{ public static void main( ...
  • java澶绾跨▼鏈夊嚑绉瀹炵幇鏂规硶,閮芥槸浠涔?鍚屾鏈夊嚑绉嶅疄鐜版柟娉,閮芥槸浠涔?
    绛旓細java涓澶氱嚎绋嬬殑瀹炵幇鏂规硶鏈変袱绉嶏細1.鐩存帴缁ф壙thread绫伙紱2.瀹炵幇runnable鎺ュ彛锛涘悓姝ョ殑瀹炵幇鏂规硶鏈変簲绉嶏細1.鍚屾鏂规硶锛2.鍚屾浠g爜鍧楋紱3.浣跨敤鐗规畩鍩熷彉閲(volatile)瀹炵幇绾跨▼鍚屾锛4.浣跨敤閲嶅叆閿佸疄鐜扮嚎绋嬪悓姝ワ紱5.浣跨敤灞閮ㄥ彉閲忓疄鐜扮嚎绋嬪悓姝 銆傚叾涓绾跨▼瀹炵幇杩囩▼涓渶娉ㄦ剰閲嶅啓鎴栬呰鐩杛un()鏂规硶锛岃屽浜庡悓姝ョ殑瀹炵幇鏂规硶涓...
  • java 澶绾跨▼鏈夊嚑绉瀹炵幇鏂规硶
    绛旓細start()鏂规硶鏄涓涓native鏂规硶锛屽畠灏嗗惎鍔ㄤ竴涓柊绾跨▼锛屽苟鎵цrun()鏂规硶銆傝繖绉鏂瑰紡瀹炵幇澶氱嚎绋嬪緢绠鍗曪紝閫氳繃鑷繁鐨勭被鐩存帴extend Thread锛屽苟澶嶅啓run()鏂规硶锛屽氨鍙互鍚姩鏂扮嚎绋嬪苟鎵ц鑷繁瀹氫箟鐨剅un()鏂规硶銆備緥濡傦細[java] view plain copy public class MyThread extends Thread { public void run() { System....
  • 鍦Java 涓澶绾跨▼鐨瀹炵幇鏂规硶鏈夊摢浜,濡備綍浣跨敤锝烇綖锝炴
    绛旓細1銆 璁よ瘑Thread鍜孯unnable Java涓疄鐜澶氱嚎绋嬫湁涓ょ閫斿緞锛氱户鎵縏hread绫绘垨鑰呭疄鐜癛unnable鎺ュ彛銆俁unnable鏄帴鍙o紝寤鸿鐢ㄦ帴鍙g殑鏂瑰紡鐢熸垚绾跨▼锛屽洜涓烘帴鍙e彲浠ュ疄鐜板缁ф壙锛屽喌涓擱unnable鍙湁涓涓猺un鏂规硶锛屽緢閫傚悎缁ф壙銆傚湪浣跨敤Thread鐨勬椂鍊欏彧闇缁ф壙Thread锛屽苟涓攏ew涓涓疄渚嬪嚭鏉ワ紝璋冪敤start()鏂规硶鍗冲彲浠ュ惎鍔涓涓嚎绋銆俆hread ...
  • 鍦Java 涓澶绾跨▼鐨瀹炵幇鏂规硶鏈夊摢浜,濡備綍浣跨敤
    绛旓細鍏蜂綋鏄垱寤篊allable鎺ュ彛鐨瀹炵幇绫,骞跺疄鐜癱lall()鏂规硶銆傚苟浣跨敤FutureTask绫绘潵鍖呰Callable瀹炵幇绫荤殑瀵硅薄,涓斾互姝utureTask瀵硅薄浣滀负Thread瀵硅薄鐨則arget鏉ュ垱寤绾跨▼銆 鐪嬬潃濂藉儚鏈夌偣澶嶆潅,鐩存帴鏉ョ湅涓涓渚嬪瓙灏辨竻鏅颁簡銆 澶嶅埗浠g爜 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 5 Callable<...
  • java鎬庝箞鍒涘缓涓涓嚎绋
    绛旓細绗簩绉嶇紪鍐欑嚎绋嬫墽琛屼唬鐮佺殑鏂瑰紡鏄柊寤涓涓疄鐜浜java.lang.Runnable鎺ュ彛鐨勭被鐨勫疄渚嬶紝瀹炰緥涓殑鏂规硶鍙互琚嚎绋嬭皟鐢ㄣ備笅闈㈢粰鍑轰緥瀛愶細public class MyRunnable implements Runnable { public void run(){ System.out.println("MyRunnable running"); }}涓轰簡浣跨嚎绋鑳藉鎵цrun()鏂规硶锛岄渶瑕佸湪Thread绫荤殑...
  • 扩展阅读:jquerymobile日本ad ... 为啥都不建议学软件测试 ... java自学入门免费网站 ... www.vivo.com ... 零基础java自学教程 ... java全套学习视频 ... 一个初中生学java ... 俄罗斯iphone13视频 ... javascript免费网站 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网