用Java实现多线程有哪些途径?

java\u591a\u7ebf\u7a0b\u90fd\u6709\u51e0\u79cd\u65b9\u5f0f\u5b9e\u73b0\uff1f\uff1f

\u6709\u4e09\u79cd\uff1a
(1)\u7ee7\u627fThread\u7c7b\uff0c\u91cd\u5199run\u51fd\u6570
\u521b\u5efa\uff1a
class xx extends Thread{
public void run(){
Thread.sleep(1000)//\u7ebf\u7a0b\u4f11\u77201000\u6beb\u79d2\uff0csleep\u4f7f\u7ebf\u7a0b\u8fdb\u5165Block\u72b6\u6001\uff0c\u5e76\u91ca\u653e\u8d44\u6e90
}}
\u5f00\u542f\u7ebf\u7a0b\uff1a
\u5bf9\u8c61.start()//\u542f\u52a8\u7ebf\u7a0b\uff0crun\u51fd\u6570\u8fd0\u884c
(2)\u5b9e\u73b0Runnable\u63a5\u53e3\uff0c\u91cd\u5199run\u51fd\u6570
\u5f00\u542f\u7ebf\u7a0b\uff1a
Thread t = new Thread(\u5bf9\u8c61)//\u521b\u5efa\u7ebf\u7a0b\u5bf9\u8c61
t.start()
(3)\u5b9e\u73b0Callable\u63a5\u53e3\uff0c\u91cd\u5199call\u51fd\u6570
Callable\u662f\u7c7b\u4f3c\u4e8eRunnable\u7684\u63a5\u53e3\uff0c\u5b9e\u73b0Callable\u63a5\u53e3\u7684\u7c7b\u548c\u5b9e\u73b0Runnable\u7684\u7c7b\u90fd\u662f\u53ef\u88ab\u5176\u5b83\u7ebf\u7a0b\u6267\u884c\u7684\u4efb\u52a1\u3002
Callable\u548cRunnable\u6709\u51e0\u70b9\u4e0d\u540c:
\u2460Callable\u89c4\u5b9a\u7684\u65b9\u6cd5\u662fcall()\uff0c\u800cRunnable\u89c4\u5b9a\u7684\u65b9\u6cd5\u662frun().
\u2461Callable\u7684\u4efb\u52a1\u6267\u884c\u540e\u53ef\u8fd4\u56de\u503c\uff0c\u800cRunnable\u7684\u4efb\u52a1\u662f\u4e0d\u80fd\u8fd4\u56de\u503c\u7684
\u2462call()\u65b9\u6cd5\u53ef\u629b\u51fa\u5f02\u5e38\uff0c\u800crun()\u65b9\u6cd5\u662f\u4e0d\u80fd\u629b\u51fa\u5f02\u5e38\u7684\u3002
\u2463\u8fd0\u884cCallable\u4efb\u52a1\u53ef\u62ff\u5230\u4e00\u4e2aFuture\u5bf9\u8c61\uff0cFuture\u8868\u793a\u5f02\u6b65\u8ba1\u7b97\u7684\u7ed3\u679c\u3002\u5b83\u63d0\u4f9b\u4e86\u68c0\u67e5\u8ba1\u7b97\u662f\u5426\u5b8c\u6210\u7684\u65b9\u6cd5,\u4ee5\u7b49
\u5f85\u8ba1\u7b97\u7684\u5b8c\u6210,\u5e76\u68c0\u7d22\u8ba1\u7b97\u7684\u7ed3\u679c.\u901a\u8fc7Future\u5bf9\u8c61\u53ef\u4e86\u89e3\u4efb\u52a1\u6267\u884c\u60c5\u51b5,\u53ef\u53d6\u6d88\u4efb\u52a1\u7684\u6267\u884c,\u8fd8\u53ef\u83b7\u53d6\u4efb\u52a1\u6267\u884c\u7684\u7ed3\u679c

//\u89e3\u51b3\u65b9\u6848-1 \u8bbe\u7f6e3\u628a\u9501, \u7136\u540e\u628a\u9501\u4eec\u5e94\u7528\u5230\u6240\u6709\u7ebf\u7a0b\u4e2d (\u6d89\u53ca\u5230synchronized wait notify\u7b49, \u5acc\u9ebb\u70e6. \u7565)
\u89e3\u51b3\u65b9\u6848-2 \u8bbe\u7f6e3\u4e2a\u5168\u5c40\u5171\u4eab\u7684\u4fe1\u53f7\u6807\u8bb0(\u4fe1\u53f7\u706f) + 3\u5b50\u7ebf\u7a0b\u5206\u522b\u5360\u7528\u6807\u8bb01 2 3
+ \u4e3b\u7ebf\u7a0b\u8f6e\u8be2/\u7b49\u5f85
(\u7b80\u6d01\u660e\u5feb \u63a8\u8350)

//\u89e3\u51b3\u65b9\u6848-2 \u5b9e\u73b0\u5982\u4e0b:
static boolean t1_done = false;
static boolean t2_done = false;
static boolean t3_done = false;

//t1------run() { ............ ; t1_done = true; }
//t2\u3001 3: \u540c\u7406,\u7565

main () { .............;
\u542f\u52a8t1;
\u542f\u52a8t2;
\u542f\u52a8t3;

//\u8f6e\u8be2 or \u7b49\u5f85
while ( true )
if ( t1_done && t2_done && t3_done) break;
else
Thread.yield () ;
// \u6216 Thread.sleep(xxxx) ----\u82e5\u5b50\u7ebf\u7a0b\u8fd0\u884c\u8d85\u8fc7100ms\u4ee5\u4e0a,\u5e94\u4e88\u8003\u8651

//\u8f6e\u8be2\u7ed3\u675f,\u4e3b\u7ebf\u7a0b\u7ee7\u7eed\u5de5\u4f5c
} //main END

have fun

1,创建Thread类的子类
在这个途径中,用户程序需要创建自己的Thread类的子类,并在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。这样在用户程序需要建立自己的线程时,它只需要创建一个已定义好的Thread子类的实例就可以了。
例:
public class TestThread{
...(中间的就不写了)
}
class Test1 extends Thread{
public void run(){
...............
}
}
2.实现Runnable接口
在这个途径中,已经有了一个父类的用户类可以通过实现Runnable接口的方法来定义用户线程的操作。Runnable接口只有一个方法run(),实现这个借口,就必须要定义run()方法的具体内容,用户新建线程的操作也就由这个方法来决定。定义好run()方法之后,当用户程序需要建立新线程时,只要以这个实现了run()方法的类对象为参数创建系统类Thread的对象,就可以把用户实现的run()方法借用过来。
public class TestRunnable implements Runnable{
Lable prompt1 = new Label("1");
Lable prompt2 = new Label("2");
.......
Thread thread1,thread2;
.......
}
public void init(){
add(.....);
.......
.......
}
public void start(){
thread1 = new Thread(........);//(我就写一个。)创建1,2个线程对象,其他的不写了
thread1.start();
}
public void run(){........}
}

通常线程是在系统层被实现的。java是第一个在语言中实现的。java在语言级提供了对多线程设计的支持。线程:是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。多线程帮助你写出CPU最大利用率的高效程序。举例来说,网络的数据传送速率远远低于CPU处理能力,本地文件系统资源的读写速度也远远低于CPU的处理能力,在传统的单线程环境中,你的程序必须等待每一个这样的任务完成以后才能执行下一步--尽管CPU大部分时间处于空闲。而JAVA的多线程能使你充分利用这些空闲的时间。在一个单线程程序中如果出现阻塞则整个程序都可能停止运行,而在一个多线程的程序中这不会出现这样的问题。当一个线程阻塞时,别的线程会运行,这样可以大大的提高CPU效率。

第一种是继承Thread类
第二种是实现Runnable接口
但是为了实现多态性,推荐第二种方式
具体实现方法 见楼上!

1.
public class AAA extends Thread{
public void run(){

}
}
2. public class BBB implements Runnable{
public void run(){}
}

83794229 <高技术软件交流>

  • 鐢↗ava瀹炵幇澶氱嚎绋嬫湁鍝簺閫斿緞?
    绛旓細1锛鍒涘缓Thread绫荤殑瀛愮被 鍦ㄨ繖涓斿緞涓紝鐢ㄦ埛绋嬪簭闇瑕佸垱寤鸿嚜宸辩殑Thread绫荤殑瀛愮被锛屽苟鍦ㄥ瓙绫讳腑閲嶆柊瀹氫箟鑷繁鐨剅un()鏂规硶锛岃繖涓猺un()鏂规硶涓寘鍚簡鐢ㄦ埛绾跨▼鐨勬搷浣溿傝繖鏍峰湪鐢ㄦ埛绋嬪簭闇瑕佸缓绔嬭嚜宸辩殑绾跨▼鏃讹紝瀹冨彧闇瑕佸垱寤轰竴涓凡瀹氫箟濂界殑Thread瀛愮被鐨勫疄渚嬪氨鍙互浜嗐備緥锛歱ublic class TestThread{ ...(涓棿鐨勫氨涓嶅啓浜...
  • java澶氱嚎绋嬫湁鍑犵瀹炵幇鏂规硶
    绛旓細澶氱嚎绋嬫湁4绉嶅疄鐜版柟娉曪紝鍒嗗埆鏄户鎵縏hread绫汇佸疄鐜癛unnable鎺ュ彛銆佸疄鐜癈allable鎺ュ彛閫氳繃FutureTask鍖呰鍣ㄦ潵鍒涘缓Thread绾跨▼銆佷娇鐢‥xecutorService銆丆allable銆丗uture瀹炵幇鏈夎繑鍥炵粨鏋滅殑澶氱嚎绋銆俆hread绫绘湰璐ㄤ笂鏄疄鐜颁簡Runnable鎺ュ彛鐨勪竴涓疄渚嬶紝浠h〃涓涓嚎绋嬬殑瀹炰緥銆傚惎鍔ㄧ嚎绋嬬殑鍞竴鏂规硶灏辨槸閫氳繃Thread绫荤殑start()瀹炰緥鏂规硶銆俿tart...
  • 鍦Java 涓绾跨▼鐨勫疄鐜鏂规硶鏈夊摢浜,濡備綍浣跨敤锝烇綖锝炴
    绛旓細Java涓疄鐜板绾跨▼鏈変袱绉嶉斿緞锛氱户鎵縏hread绫绘垨鑰呭疄鐜癛unnable鎺ュ彛銆俁unnable鏄帴鍙o紝寤鸿鐢ㄦ帴鍙g殑鏂瑰紡鐢熸垚绾跨▼锛屽洜涓烘帴鍙e彲浠ュ疄鐜板缁ф壙锛屽喌涓擱unnable鍙湁涓涓猺un鏂规硶锛屽緢閫傚悎缁ф壙銆傚湪浣跨敤Thread鐨勬椂鍊欏彧闇缁ф壙Thread锛屽苟涓攏ew涓涓疄渚嬪嚭鏉ワ紝璋冪敤start()鏂规硶鍗冲彲浠ュ惎鍔ㄤ竴涓嚎绋嬨俆hread Test = new Thread();Test...
  • java 澶氱嚎绋嬫湁鍑犵瀹炵幇鏂规硶
    绛旓細1銆佺户鎵縏hread绫诲疄鐜板绾跨▼ 缁ф壙Thread绫荤殑鏂规硶灏界琚垜鍒椾负涓绉嶅绾跨▼瀹炵幇鏂瑰紡锛屼絾Thread鏈川涓婁篃鏄疄鐜颁簡Runnable鎺ュ彛鐨勪竴涓疄渚嬶紝瀹冧唬琛ㄤ竴涓嚎绋嬬殑瀹炰緥锛屽苟涓旓紝鍚姩绾跨▼鐨勫敮涓鏂规硶灏辨槸閫氳繃Thread绫荤殑start()瀹炰緥鏂规硶銆俿tart()鏂规硶鏄竴涓猲ative鏂规硶锛屽畠灏嗗惎鍔ㄤ竴涓柊绾跨▼锛屽苟鎵цrun()鏂规硶銆傝繖绉嶆柟寮忓疄鐜板...
  • 澶氱嚎绋嬪疄鐜扮殑鍥涚鏂瑰紡
    绛旓細澶氱嚎绋嬪疄鐜扮殑鍥涚鏂瑰紡Thread瑁哥嚎绋嬨丒xecutor鏈嶅姟銆丗orkJoin妗嗘灦銆丄ctor妯″瀷銆1銆乀hread瑁哥嚎绋 绾跨▼鏄苟鍙戞渶鍩烘湰鐨勫崟鍏冦侸ava绾跨▼鏈川涓婅鏄犲皠鍒版搷浣滅郴缁熺嚎绋嬶紝骞朵笖姣忎釜绾跨▼瀵硅薄瀵瑰簲鐫涓涓绠楁満搴曞眰绾跨▼銆傛瘡涓嚎绋嬫湁鑷繁鐨勬爤绌洪棿锛屽畠鍗犵敤浜咼VM杩涚▼绌洪棿鐨勬寚瀹氫竴閮ㄥ垎銆傜嚎绋嬬殑鎺ュ彛鐩稿綋绠鏄庯紝浣犲彧闇瑕佹彁渚涗竴涓猂unnable...
  • 澶氱嚎绋嬫湁鍝簺鏂规硶
    绛旓細澶氱嚎绋嬫柟娉曚富瑕佸寘鎷互涓嬪嚑绉嶏細涓銆佺嚎绋嬪垱寤轰笌閿姣 1. 鍒涘缓绾跨▼锛氬寘鎷户鎵縏hread绫诲拰浣跨敤瀹炵幇Runnable鎺ュ彛鐨勬柟寮忓垱寤虹嚎绋嬨傝繖涓ょ鏂瑰紡閮藉彲浠ュ惎鍔ㄦ柊绾跨▼锛屾墽琛岀嚎绋嬩换鍔°2. 閿姣佺嚎绋嬶細閫氳繃璋冪敤绾跨▼鐨刬nterrupt()鏂规硶涓柇绾跨▼锛屾垨鑰呯瓑寰呯嚎绋嬩换鍔℃墽琛屽畬姣曡嚜鍔ㄩ攢姣併傞渶瑕佹敞鎰忕殑鏄紝绾跨▼鐨勭敓鍛藉懆鏈熺敱鍏惰嚜韬换鍔″拰鎺у埗...
  • java澶氱嚎绋嬫湁鍑犵瀹炵幇鏂规硶,閮芥槸浠涔?鍚屾鏈夊嚑绉嶅疄鐜版柟娉,閮芥槸浠涔...
    绛旓細java涓绾跨▼鐨勫疄鐜鏂规硶鏈変袱绉嶏細1.鐩存帴缁ф壙thread绫伙紱2.瀹炵幇runnable鎺ュ彛锛涘悓姝ョ殑瀹炵幇鏂规硶鏈変簲绉嶏細1.鍚屾鏂规硶锛2.鍚屾浠g爜鍧楋紱3.浣跨敤鐗规畩鍩熷彉閲(volatile)瀹炵幇绾跨▼鍚屾锛4.浣跨敤閲嶅叆閿佸疄鐜扮嚎绋嬪悓姝ワ紱5.浣跨敤灞閮ㄥ彉閲忓疄鐜扮嚎绋嬪悓姝 銆傚叾涓绾跨▼瀹炵幇杩囩▼涓渶娉ㄦ剰閲嶅啓鎴栬呰鐩杛un()鏂规硶锛岃屽浜庡悓姝ョ殑瀹炵幇鏂规硶涓...
  • 澶氱嚎绋嬫湁鍝簺瀹炵幇鏂瑰紡?
    绛旓細java澶氱嚎绋嬬殑鍑犵瀹炵幇鏂瑰紡锛1.缁ф壙Thread绫伙紝閲嶅啓run鏂规硶 2.瀹炵幇Runnable鎺ュ彛锛岄噸鍐檙un鏂规硶锛屽疄鐜癛unnable鎺ュ彛鐨勫疄鐜扮被鐨勫疄渚嬪璞′綔涓篢hread鏋勯犲嚱鏁扮殑target 3.閫氳繃Callable鍜孎utureTask鍒涘缓绾跨▼ 4.閫氳繃绾跨▼姹犲垱寤虹嚎绋 锛堜笂涓绡囧凡缁忚杩囦簡锛夊墠闈袱绉嶅彲浠ュ綊缁撲负涓绫伙細鏃犺繑鍥炲硷紝鍘熷洜寰堢畝鍗曪紝閫氳繃閲嶅啓run鏂规硶锛...
  • 澶氱嚎绋缂栫▼鐨勪袱绉瀹炵幇鏂瑰紡
    绛旓細棣栧厛锛屾垜浠潵鐪嬮氳繃缁ф壙Thread绫绘潵瀹炵幇澶氱嚎绋缂栫▼銆傚湪Java涓锛屾瘡涓嚎绋嬮兘琚涓轰竴涓璞★紝鑰岃繖涓璞″繀椤荤户鎵縏hread绫汇傚綋鎴戜滑鍒涘缓涓涓柊绾跨▼鏃讹紝鎴戜滑闇瑕侀噸鍐橳hread绫荤殑run()鏂规硶锛岃鏂规硶鍖呭惈浜嗙嚎绋嬪簲褰撴墽琛岀殑浠g爜銆備竴鏃︾嚎绋嬭鍚姩锛屽畠灏变細鎵ц杩欎釜run()鏂规硶銆備緥濡傦細java public class MyThread extends ...
  • java澶氱嚎绋嬫湁鍑犵瀹炵幇鏂规硶,閮芥槸浠涔?鍚屾鏈夊嚑绉嶅疄鐜版柟娉,閮芥槸浠涔...
    绛旓細java涓绾跨▼鐨勫疄鐜鏂规硶鏈変袱绉嶏細1.鐩存帴缁ф壙thread绫伙紱2.瀹炵幇runnable鎺ュ彛锛涘悓姝ョ殑瀹炵幇鏂规硶鏈変簲绉嶏細1.鍚屾鏂规硶锛2.鍚屾浠g爜鍧楋紱3.浣跨敤鐗规畩鍩熷彉閲(volatile)瀹炵幇绾跨▼鍚屾锛4.浣跨敤閲嶅叆閿佸疄鐜扮嚎绋嬪悓姝ワ紱5.浣跨敤灞閮ㄥ彉閲忓疄鐜扮嚎绋嬪悓姝 銆傚叾涓绾跨▼瀹炵幇杩囩▼涓渶娉ㄦ剰閲嶅啓鎴栬呰鐩杛un()鏂规硶锛岃屽浜庡悓姝ョ殑瀹炵幇鏂规硶涓...
  • 扩展阅读:java多线程实例代码 ... hashset和hashmap区别 ... java中线程的五种状态 ... 多线程几种方法 ... java 流实现多线程 ... 多线程实现的四种方式 ... java 多线程实现排序 ... java多线程经典实例 ... java中实现多线程的方法 ...

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