Java多线程编程基础之线程对象

    在进入java平台的线程对象之前 基于基础篇(一)的一些问题 我先插入两个基本概念         线程的并发与并行        在单CPU系统中 系统调度在某一时刻只能让一个线程运行 虽然这种调试机制有多种形式(大多数是时间片轮巡为主) 但无论如何 要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent) 而在多CPU系统中 可以让两个以上的线程同时运行 这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)         在上面包括以后的所有论述中 请各位朋友谅解 我无法用最准确的词语来定义储如并发和并行这类术语 但我以我的经验能通俗地告诉大家它是怎么一回事 如果您看到我说的一些 标准 文档上说的不一样 只要意思一致 那您就不要挑刺了         Java线程对象        现在我们来开始考察JAVA中线程对象         在JAVA中 要开始一个线程 有两种方式 一是直接调用Thread实例的start()方法 二是        将Runable实例传给一个Thread实例然后调用它的start()方法         在前面已经说过 线程对象和线程是两个完全不同的概念 这里我们再次深入一下 生成一个线程的实例 并不代表启动了线程 而启动线程是说在某个线程对象上启动了该实例对应的线程 当该线程结束后 并不会就立即消失         对于从很多书籍上可以看到的基础知识我就不用多说了 既然是基础知识 我也着重于从普通文档上读不到的内容 所以本节我重点要说的是两种线程对象产生线程方式的区别         class MyThread extends Thread{        public int x = ;        public void run(){        for(int i= ;i< ;i++){          try{        Thread sleep( )           }catch(Exception e){}          System out println(x++)         }        }        }        如果我们生成MyThread的一个实例 然后调用它的start()方法 那么就产生了这个实例对应的线程         public class Test {        public static void main(String[] args) throws Exception{        MyThread mt = new MyThread()         mt start()         }        }        不用说 最终会打印出 到 现在我们稍微玩一点花样         public class Test {        public static void main(String[] args) throws Exception{        MyThread mt = new MyThread()         mt start()         System out println( )         }        }        也不用说 在基础篇(一)中我们知道由于单CPU的原因 一般会先打印 然后打印 到 不过我们可以控制线程让它按我们的意思来运行         public class Test {        public static void main(String[] args) throws Exception{        MyThread mt = new MyThread()         mt start()         mt join()         System out println( )         }        }        好了 我们终于看到 mt实例对应的线程(假如我有时说mt线程请你不要怪我 不过我尽量不这么说) 在运行完成后 主线程才打印 因为我们让当前线程(这里是主线程)等待mt线程的运行结束 在线程对象a上调用join()方法 就是让当前正在执行的线程等待线程对象a对应的线程运行完成后才继续运行 请大家一定要深刻理解并熟记这句话 而我这里引出这个知识点的目的是为了让你继续看下面的例子         public class Test {        public static void main(String[] args) throws Exception{        MyThread mt = new MyThread()         mt start()         mt join()         Thread sleep( )         mt start()         }        }        当线程对象mt运行完成后 我们让主线程休息一下 然后我们再次在这个线程对象上启动线程 结果我们看到         Exception in thread main java lang IllegalThreadStateException        也就是这种线程对象一时运行一次完成后 它就再也不能运行第二次了 我们可以看一下它有具体实现         public synchronized void start() {        if (started)        throw new IllegalThreadStateException()         started = true;        group add(this)         start ()         }        一个Thread的实例一旦调用start()方法 这个实例的started标记就标记为true 事实中不管这个线程后来有没有执行到底 只要调用了一次start()就再也没有机会运行了 这意味着         通过Thread实例的start() 一个Thread的实例只能产生一个线程        那么如果要在一个实例上产生多个线程(也就是我们常说的线程池) 我们应该如何做呢?这就是Runnable接口给我们带来的伟大的功能         class R implements Runnable{        private int x = ;        public void run(){        for(int i= ;i< ;i++){          try{        Thread sleep( )           }catch(Exception e){}          System out println(x++)         }        }        }        正如它的名字一样 Runnable的实例是可运行的 但它自己并不能直接运行 它需要被Thread对象来包装才行运行         public class Test {        public static void main(String[] args) throws Exception{        new Thread(new R()) start()         }        }        当然这个结果和mt start()没有什么区别 但如果我们把一个Runnable实例给Thread对象多次包装 我们就可以看到它们实际是在同一实例上启动线程         public class Test {        public static void main(String[] args) throws Exception{        R r = new R()         for(int i= ;i< ;i++)          new Thread(r) start()         }        }        x是实例对象 但结果是x被加到了 说明这 个线程是在同一个r对象上运行的 请大家注意 因为这个例子是在单CPU上运行的 所以没有对多个线程同时操作共同的对象进行同步 这里是为了说明的方便而简化了同步 而真正的环境中你无法预知程序会在什么环境下运行 所以一定要考虑同步         到这里我们做一个完整的例子来说明线程产生的方式不同而生成的线程的区别         package debug;        import java io *;        import java lang Thread;        class MyThread extends Thread{        public int x = ;        public void run(){        System out println(++x)         }        }        class R implements Runnable{        private int x = ;        public void run(){        System out println(++x)         }        }        public class Test {        public static void main(String[] args) throws Exception{        for(int i= ;i< ;i++){          Thread t = new MyThread()           t start()         }        Thread sleep( ) //让上面的线程运行完成        R r = new R()         for(int i= ;i< ;i++){          Thread t = new Thread(r)           t start()         }        }        }        上面 个线程对象产生的 个线程运行时打印了 次 下面 个线程对象产生的 个线程运行时打印了 到 我们把下面的 个线程称为同一实例(Runnable实例)的多个线程 lishixinzhi/Article/program/Java/gj/201311/27500



  • Java澶氱嚎绋嬬紪绋嬪熀纭涔嬬嚎绋瀵硅薄
    绛旓細鍦ㄨ繘鍏java骞冲彴鐨绾跨▼瀵硅薄涔嬪墠 鍩轰簬鍩虹绡囷紙涓锛夌殑涓浜涢棶棰 鎴戝厛鎻掑叆涓や釜鍩烘湰姒傚康 绾跨▼鐨勫苟鍙戜笌骞惰 鍦ㄥ崟CPU绯荤粺涓 绯荤粺璋冨害鍦ㄦ煇涓鏃跺埢鍙兘璁╀竴涓嚎绋嬭繍琛 铏界劧杩欑璋冭瘯鏈哄埗鏈夊绉嶅舰寮忥紙澶у鏁版槸鏃堕棿鐗囪疆宸′负涓伙級 浣嗘棤璁哄浣 瑕侀氳繃涓嶆柇鍒囨崲闇瑕佽繍琛岀殑绾跨▼璁╁叾杩愯鐨勬柟寮忓氨鍙苟鍙戯紙concurrent锛 鑰...
  • Java澶氱嚎绋嬬▼搴忚璁璇︾粏瑙f瀽
    绛旓細绾跨▼缁勬槸Java鐗规湁鐨勬蹇碉紝鐢ㄤ簬缁勭粐鍜岀鐞嗙嚎绋嬨傛瘡涓嚎绋嬪睘浜庝竴涓嚎绋嬬粍锛岀嚎绋嬬粍鍙互宓屽銆備節銆佹荤粨 澶氱嚎绋嬬紪绋澶嶆潅涓斾綆鏁堬紝闇瑕佹牴鎹▼搴忕殑鐗圭偣鏉ュ喅瀹氭槸鍚︿娇鐢ㄥ绾跨▼銆傚绾跨▼鐨勬牳蹇冨湪浜庡苟鍙戞墽琛岀殑浠g爜鍧楋紝涔卞簭鎵ц鏄叾鏈川鐗圭偣銆
  • java澶氱嚎绋嬬紪绋涓秹鍙婄殑鍩虹鐭ヨ瘑鐐?
    绛旓細鏈夊叾浠绾跨▼鐨刬nterrupt鏂规硶鏉ュ敜閱掔嚎绋 wait鏂规硶瓒呮椂 notify鏂规硶 璇ユ柟娉曚細灏嗙瓑寰呴槦鍒椾腑鐨勪竴涓嚎绋嬪幓闄ゃ傚悓wait鏂规硶涓鏍凤紝鑻ヨ鎵цnotify鏂规硶锛岀嚎绋嬩篃蹇呴』鎸佹湁瑕佽皟鐢ㄧ殑瀹炰緥鐨勯攣銆俷otifyAll鏂规硶 notify鏂规硶浠呭敜閱掍竴涓嚎绋嬶紝鑰宯otifyAll鍒欏敜閱掓墍鏈夌嚎绋嬶紝杩欐槸涓よ呬箣闂寸殑鍖哄埆 鍚寃ait鏂规硶鍜宯otify鏂规硶涓鏍凤紝notifyAll鏂...
  • Java澶氱嚎绋嬬▼搴忚璁璇︾粏瑙f瀽
    绛旓細寰堟樉鐒,鎴戜滑蹇呴』鎸囨槑杩欎釜绾跨▼鎵瑕佹墽琛岀殑浠g爜,鑰岃繖灏辨槸鍦Java涓疄鐜板绾跨▼鎴戜滑鎵闇瑕佸仛鐨勪竴鍒!鐪熸槸绁炲!Java鏄浣曞仛鍒拌繖涓鐐圭殑?閫氳繃绫!浣滀负涓涓畬鍏ㄩ潰鍚戝璞$殑璇█,Java鎻愪緵浜嗙被java.lang.Thread鏉ユ柟渚澶氱嚎绋嬬紪绋,杩欎釜绫绘彁渚涗簡澶ч噺鐨勬柟娉曟潵鏂逛究鎴戜滑鎺у埗鑷繁鐨勫悇涓嚎绋,鎴戜滑浠ュ悗鐨勮璁洪兘灏嗗洿缁曡繖涓被杩涜銆傞偅涔堝浣曟彁渚...
  • Java澶氱嚎绋嬬▼搴忚璁鍒濇鍏ラ棬
    绛旓細濡傛灉鎴戜滑閲囩敤澶氱嚎绋嬪悓姝ユ帶鍒舵満鍒 绛夊埌绗竴涓嚎绋嬭鍙栧畬鏁版嵁 绗簩涓嚎绋嬫墠鑳藉鐞嗚鏁版嵁 灏变細閬垮厤閿欒 鍙 绾跨▼鍚屾鏄澶氱嚎绋嬬紪绋鐨勪竴涓浉褰撻噸瑕佺殑鎶鏈 鍦ㄨ绾跨▼鐨勫悓姝ユ帶鍒跺墠鎴戜滑闇瑕佷氦浠e涓嬫蹇 鐢Java鍏抽敭瀛梥ynchonized鍚屾瀵瑰叡浜暟鎹搷浣滅殑鏂规硶 鍦ㄤ竴涓璞′腑 鐢╯ynchonized澹版槑鐨勬柟娉曚负鍚屾鏂规硶 Java涓湁涓涓悓姝ユā...
  • 浠涔堟槸java澶氱嚎绋璇﹁В
    绛旓細锛1锛夎繘绋嬩箣闂翠笉鑳藉叡浜暟鎹紝绾跨▼鍙互锛涳紙2锛夌郴缁熷垱寤鸿繘绋嬮渶瑕佷负璇ヨ繘绋嬮噸鏂板垎閰嶇郴缁熻祫婧愶紝鏁呭垱寤虹嚎绋嬩唬浠锋瘮杈冨皬锛涳紙3锛塉ava璇█鍐呯疆浜嗗绾跨▼鍔熻兘鏀寔锛岀畝鍖栦簡java澶氱嚎绋嬬紪绋銆備竴銆佸垱寤虹嚎绋嬪拰鍚姩 锛1锛夌户鎵縏hread绫诲垱寤虹嚎绋嬬被 閫氳繃缁ф壙Thread绫诲垱寤虹嚎绋嬬被鐨勫叿浣撴楠ゅ拰鍏蜂綋浠g爜濡備笅锛• 瀹氫箟涓涓户鎵...
  • java 澶氱嚎绋
    绛旓細绾跨▼绫绘槸鎺у埗绾跨▼琛屼负鐨勫敮涓鐨勬墜娈点備竴鏃︿竴涓Java绋嬪簭鍚姩鍚庯紝灏卞凡缁忔湁涓涓嚎绋嬪湪杩愯銆傚彲閫氳繃璋冪敤Thread.currentThread鏂规硶鏉ユ煡鐪嬪綋鍓嶈繍琛岀殑鏄摢涓涓嚎绋嬨俢lass ThreadTest{ public static void main(String args[]){ Thread t = Thread.currentThread();t.setName("鍗曠嚎绋"); //瀵圭嚎绋嬪彇鍚嶄负"鍗曠嚎绋...
  • 绠閫java璇█涓绾跨▼瀵硅薄閮芥湁鍝簺鐘舵,杩欎簺鐘舵佸浣曞彉鍖
    绛旓細鏈夊叧璇︾粏鐘舵佽浆鎹㈠浘鍙互鍙傜湅鏈汉鐨勨Java澶氱嚎绋嬬紪绋鎬荤粨鈥濅腑鐨勫浘 浜屻侀樆姝㈢嚎绋嬫墽琛 瀵逛簬绾跨▼鐨勯樆姝紝鑰冭檻涓涓嬩笁涓柟闈紝涓嶈冭檻IO闃诲鐨勬儏鍐碉細鐫$湢锛涚瓑寰咃紱鍥犱负闇瑕佷竴涓璞$殑閿佸畾鑰岃闃诲銆1銆佺潯鐪 Thread.sleep(long millis)鍜孴hread.sleep(long millis, int nanos)闈欐佹柟娉曞己鍒跺綋鍓嶆鍦ㄦ墽琛岀殑绾跨▼浼戠湢锛...
  • JAVA澶氱嚎绋嬬紪绋鐨勫嚑绉嶈〃绀烘柟娉
    绛旓細鏂规硶涓锛氱户鎵 Thread 绫伙紝瑕嗙洊鏂规硶 run()锛屾垜浠湪鍒涘缓鐨 Thread 绫荤殑瀛愮被涓噸鍐 run() ,鍔犲叆绾跨▼鎵瑕佹墽琛岀殑浠g爜鍗冲彲銆備笅闈㈡槸涓涓緥瀛愶細public class MyThread extends Thread { int count= 1, number;public MyThread(int num) { number = num;System.out.println("鍒涘缓绾跨▼ " + number);} pu...
  • Java澶氱嚎绋闂鍙婂鐞(绗旇)
    绛旓細鍦澶氱嚎绋嬬紪绋涓 鏀寔涓烘瘡涓嚎绋嬭缃紭鍏堢骇 浼樺厛绾ч珮鐨勭嚎绋嬪湪鎺掗槦鎵ц鏃朵細鑾峰緱鏇村鐨凜PU鎵ц鏃堕棿 寰楀埌鏇村揩鐨勫搷搴 鍦ㄥ疄闄呯▼搴忎腑 鍙互鏍规嵁閫昏緫鐨勯渶瑕 灏嗛渶瑕佸緱鍒板強鏃跺鐞嗙殑绾跨▼璁剧疆鎴愯緝楂樼殑浼樺厛绾 鑰屾妸瀵规椂闂磋姹備笉楂樼殑绾跨▼璁剧疆鎴愭瘮杈冧綆鐨勪紭鍏堢骇 鍦═hread绫讳腑 鎬昏瑙勫畾浜嗕笁涓紭鍏堢骇 鍒嗗埆涓 l MAX_...
  • 扩展阅读:java多线程实例代码 ... java怎么实现多线程 ... java多线程经典实例 ... java开启新线程 ... c#多线程编程 ... 多线程经典例子 ... java编程入门 ... 现在多线程都用哪种方式 ... java多线程并发编程面试题 ...

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