欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java線(xiàn)程:什么是線(xiàn)程
一 基本概念

  多任務(wù):同一時(shí)刻運行多個(gè)程序的能力。每一個(gè)任務(wù)稱(chēng)為一個(gè)線(xiàn)程??梢酝瑫r(shí)運行一個(gè)以上線(xiàn)程的程序稱(chēng)為多線(xiàn)程程序。

  Java編寫(xiě)程序都運行在在Java虛擬機(JVM)中,在JVM的內部,程序的多任務(wù)是通過(guò)線(xiàn)程來(lái)實(shí)現的。每用java命令啟動(dòng)一個(gè)java應用程序,就會(huì )啟動(dòng)一個(gè)JVM進(jìn)程。在同一個(gè)JVM進(jìn)程中,有且只有一個(gè)進(jìn)程,就是它自己。在這個(gè)JVM環(huán)境中,所有程序代碼的運行都是以線(xiàn)程來(lái)運行。

  一般常見(jiàn)的Java應用程序都是單線(xiàn)程的。比如,用java命令運行一個(gè)最簡(jiǎn)單的HelloWorld的Java應用程序時(shí),就啟動(dòng)了一個(gè)JVM進(jìn)程,JVM找到程序程序的入口點(diǎn)main(),然后運行main()方法,這樣就產(chǎn)生了一個(gè)線(xiàn)程,這個(gè)線(xiàn)程稱(chēng)之為主線(xiàn)程。當main方法結束后,主線(xiàn)程運行完成。JVM進(jìn)程也隨即退出 。

  對于一個(gè)進(jìn)程中的多個(gè)線(xiàn)程來(lái)說(shuō),多個(gè)線(xiàn)程共享進(jìn)程的內存塊,當有新的線(xiàn)程產(chǎn)生的時(shí)候,操作系統不分配新的內存,而是讓新線(xiàn)程共享原有的進(jìn)程塊的內存。因此,線(xiàn)程間的通信很容易,速度也很快。不同的進(jìn)程因為處于不同的內存塊,因此進(jìn)程之間的通信相對困難。

  進(jìn)程是指一個(gè)內存中運行的應用程序,每個(gè)進(jìn)程都有自己獨立的一塊內存空間,一個(gè)進(jìn)程中可以啟動(dòng)多個(gè)線(xiàn)程。比如在Windows系統中,一個(gè)運行的exe就是一個(gè)進(jìn)程。

  線(xiàn)程是指進(jìn)程中的一個(gè)執行流程,一個(gè)進(jìn)程可以運行多個(gè)線(xiàn)程。比如java.exe進(jìn)程可以運行很多線(xiàn)程。線(xiàn)程總是輸入某個(gè)進(jìn)程,進(jìn)程中的多個(gè)線(xiàn)程共享進(jìn)程的內存。

  Java中線(xiàn)程是指java.lang.Thread類(lèi)的一個(gè)實(shí)例或線(xiàn)程的執行。使用java.lang.Thread或java.lang.Runnable接口編寫(xiě)代碼定義、實(shí)例化、啟動(dòng)新線(xiàn)程。
  Java中每個(gè)線(xiàn)程都有一個(gè)調用棧,即使不在程序中創(chuàng )建任何新的線(xiàn)程,線(xiàn)程也在后臺運行。main()方法運行在一個(gè)線(xiàn)程內,稱(chēng)為主線(xiàn)程。一旦創(chuàng )建一個(gè)新的線(xiàn)程,就產(chǎn)生一個(gè)新的調用棧。
  線(xiàn)程分為兩類(lèi):用戶(hù)線(xiàn)程和守候線(xiàn)程。當所有用戶(hù)線(xiàn)程執行完畢后,JVM自動(dòng)關(guān)閉。但是守候線(xiàn)程卻不獨立與JVM,守候線(xiàn)程一般是有操作系統或用戶(hù)自己創(chuàng )建的。
二 定義線(xiàn)程
1 擴展java.lang.Thread類(lèi)以及實(shí)現java.lang.Runnable接口。
  此類(lèi)中有run()方法,public void run(),如果該線(xiàn)程是獨立的Runnable運行對象構造的,則調用該Runnable對象的run()方法;否則,該方法不執行任何操作。Thread的子類(lèi)也應該重寫(xiě)該方法。
三 實(shí)例化線(xiàn)程
1 如果是擴展了java.lang.Thread類(lèi)的線(xiàn)程,則直接調用new即可。
2 如果是實(shí)現了jav.lang.Runnable接口的類(lèi),則調用Thread的構造方法:
  Thread(Runnable target)
  Thread(Runnable target,String name)
  Thread(ThreadGroup group, Runnable target)
  Thread(ThreadGroup group, Runnable target, String name)
  Thread(ThreadGroup group, Runnable target, String name, long stackSize)
四 啟動(dòng)線(xiàn)程
  在線(xiàn)程的Thread對象上調用start()方法,而不是run()或別的方法。
  在調用start()方法之前,線(xiàn)程處于新?tīng)顟B(tài)中,新?tīng)顟B(tài)有一個(gè)Thread對象,但沒(méi)有一個(gè)真正的線(xiàn)程。
  在調用start()方法之后,發(fā)生了一系列復雜的事情:  
    啟動(dòng)新的執行線(xiàn)程(具有新的調用棧);
    該線(xiàn)程從新?tīng)顟B(tài)轉移到可運行狀態(tài);
    當該線(xiàn)程獲得執行機會(huì )時(shí),其目標run()方法將運行。
五 注意事項
  1 獲取當前線(xiàn)程的對象的方法是:Thread.currentThread();
  2 當線(xiàn)程目標run()方法結束時(shí)該線(xiàn)程完成。
  3 一旦線(xiàn)程啟動(dòng),它就永遠不能再重新啟動(dòng)。只有一個(gè)新的線(xiàn)程可以被啟動(dòng),并且只能一次。一個(gè)可運行的線(xiàn)程或死線(xiàn)程可以被重新啟動(dòng)。
  4 線(xiàn)程的調度是JVM的一部分,在一個(gè)CPU的機器上上,實(shí)際上一次只能運行一個(gè)線(xiàn)程。一次只有一個(gè)線(xiàn)程棧執行。JVM線(xiàn)程調度程序決定實(shí)際運行哪個(gè)處于可運行狀態(tài)的線(xiàn)程。眾多可運行線(xiàn)程中的某一個(gè)會(huì )被選中做為當前線(xiàn)程??蛇\行線(xiàn)程被選擇運行的順序是沒(méi)有保障的。
  5 盡管通常采用隊列形式,但這是沒(méi)有保障的。隊列形式是指當一個(gè)線(xiàn)程完成“一輪”時(shí),它移到可運行隊列的尾部等待,直到它最終排隊到該隊列的前端為止,它才能被再次選中。事實(shí)上,我們把它稱(chēng)為可運行池而不是一個(gè)可運行隊列,目的是幫助認識線(xiàn)程并不都是以某種有保障的順序排列一個(gè)隊列的事實(shí)。
  6 盡管我們沒(méi)有無(wú)法控制線(xiàn)程調度程序,但可以通過(guò)別的方式來(lái)影響線(xiàn)程調度的方式。
六 示例
  當點(diǎn)擊start按鈕時(shí),程序從屏幕左上角彈出一個(gè)球,這個(gè)球開(kāi)始移動(dòng),調用addBall方法,循環(huán)運行1000次move。每調用一次move,球就會(huì )移動(dòng)一點(diǎn),當碰到墻壁時(shí),就會(huì )調整方向,但是這個(gè)程序有個(gè)弊端:當你想在移動(dòng)1000次之前,就想退出程序,點(diǎn)擊close發(fā)現,其仍在移動(dòng)。
  Thread類(lèi)的靜態(tài)方法sleep()將暫停給定的毫秒數。調用Thread.sleep不會(huì )創(chuàng )建一個(gè)新線(xiàn)程,sleep是Thread類(lèi)的靜態(tài)方法,用于暫停當前線(xiàn)程活動(dòng)。
  Bounce.java
 1 package Thread; 2 import java.awt.*; 3 import java.awt.event.*; 4 import javax.swing.*; 5 public class BounceThread { 6     public static void main(String[] args){ 7         EventQueue.invokeLater(new Runnable(){ 8             public void run(){ 9                 JFrame frame=new BounceFrame();10                 frame.setTitle("BounceFrame");11                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);12                 frame.setVisible(true);13             }14         });15     }16 }17 /*class BallRunnable implements Runnable{18     private Ball ball;19     private Component component;20     public static final int STEPS=1000;21     public static final int DELAY=5;22     public BallRunnable(Ball aBall,Component aComponent){23         ball=aBall;24         component=aComponent;25     }26     public void run(){27         try{28             for(int i=1;i<=STEPS;i++){29                 ball.move(component.getBounds());30                 component.repaint();31                 Thread.sleep(DELAY);32             }33         }34         catch(InterruptedException e){}35     }36 }*/37 class BounceFrame extends JFrame{38     private BallComponent comp;39     public static final int STEPS=1000;40     public static final int DELAY=100;41     public BounceFrame(){42         comp=new BallComponent();43         add(comp,BorderLayout.CENTER);44         JPanel buttonPanel=new JPanel();45         addButton(buttonPanel,"Start",new ActionListener(){46             public void actionPerformed(ActionEvent event){47                 addBall();48             }49         });50         addButton(buttonPanel,"Close",new ActionListener(){51             public void actionPerformed(ActionEvent event){52                 System.exit(0);53             }54         });55         add(buttonPanel,BorderLayout.SOUTH);56         pack();57     }58     public void addButton(Container c,String title,ActionListener listener){59         JButton button=new JButton(title);60         c.add(button);61         button.addActionListener(listener);62     }63     /*public void addBall(){64         Ball b=new Ball();65         comp.add(b);66         Runnable r=new BallRunnable(b,comp);67         Thread t=new Thread(r);68         t.start();69     }*/70     public void addBall(){71         try{72             Ball ball=new Ball();73             comp.add(ball);74             for(int i=1;i<=STEPS;i++){75                 ball.move(comp.getBounds());76                 comp.paint(comp.getGraphics());77                 Thread.sleep(DELAY);78             }79         }80         catch(InterruptedException e){}81     }82 }
View Code

  BollComponent.java

 1 package Thread; 2 import java.awt.*; 3  4 import java.util.*; 5 import javax.swing.*; 6 public class BallComponent extends JPanel{ 7     private static final int DEFAULT_WIDTH=450; 8     private static final int DEFAULT_HEIGHT=350; 9     private java.util.List<Ball>balls=new ArrayList<>();10     public void add(Ball b){11         balls.add(b);12     }13     public void paintComponent(Graphics g){14         super.paintComponent(g);15         Graphics2D g2=(Graphics2D)g;16         for(Ball b:balls){17             g2.fill(b.getShape());18         }19     }20     public Dimension getPreferredSize(){21         return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);22     }23 }
View Code

  Ball.java

 1 package Thread; 2 import java.awt.geom.*; 3 import java.awt.geom.Ellipse2D.Double; 4 public class Ball { 5     private static final int XSIZE=15; 6     private static final int YSIZE=15; 7     private double x=0; 8     private double y=0; 9     private double dx=1;10     private double dy=1;11     public void move(Rectangle2D bounds){12         x+=dx;13         y+=dy;14         if(x<bounds.getMinX()){15             x=bounds.getMinX();16             dx=-dx;17         }18         if(x+XSIZE>=bounds.getMaxX()){19             x=bounds.getMaxX()-XSIZE;20             dx=-dx;21         }22         if(y<bounds.getMinY()){23             y=bounds.getMinY();24             dy=-dy;25         }26         if(y+YSIZE>=bounds.getMaxY()){27             y=bounds.getMaxY()-YSIZE;28             dy=-dy;29         }30     }31     public Ellipse2D getShape(){32         return new Ellipse2D.Double(x,y,XSIZE,YSIZE);33     }34 }
View Code

  針對上述的情況,下面的代碼是改進(jìn)后的,當點(diǎn)擊close時(shí),就會(huì )退出當前線(xiàn)程。而且不論何時(shí)點(diǎn)擊Start按鈕,addBall都會(huì )啟動(dòng)一個(gè)新線(xiàn)程.

  實(shí)現多個(gè)線(xiàn)程的方法:將移動(dòng)球的代碼放置在一個(gè)獨立的線(xiàn)程中,點(diǎn)擊開(kāi)始就會(huì )重新啟動(dòng)一個(gè)線(xiàn)程。簡(jiǎn)單過(guò)程如下:

    1、將任務(wù)代碼放在實(shí)現了Runnable接口的類(lèi)的run方法中。

1 class MyRunnable implements Runnable{2      public void run(){3          task code4     }   5 }

    2、創(chuàng )建一個(gè)類(lèi)對象。Runnable r=new MyRunnable();

    3、由Runnable創(chuàng )建一個(gè)Thread對象。Thread t=new Thread();

    4、啟動(dòng)線(xiàn)程:t.start();

 BounceThread.java

 1 package Thread; 2 import java.awt.*; 3 import java.awt.event.*; 4 import javax.swing.*; 5 public class BounceThread { 6     public static void main(String[] args){ 7         EventQueue.invokeLater(new Runnable(){ 8             public void run(){ 9                 JFrame frame=new BounceFrame();10                 frame.setTitle("BounceFrame");11                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);12                 frame.setVisible(true);13             }14         });15     }16 }17 class BallRunnable implements Runnable{18     private Ball ball;19     private Component component;20     public static final int STEPS=1000;21     public static final int DELAY=5;22     public BallRunnable(Ball aBall,Component aComponent){23         ball=aBall;24         component=aComponent;25     }26     public void run(){27         try{28             for(int i=1;i<=STEPS;i++){29                 ball.move(component.getBounds());30                 component.repaint();31                 Thread.sleep(DELAY);32             }33         }34         catch(InterruptedException e){}35     }36 }37 class BounceFrame extends JFrame{38     private BallComponent comp;39     //public static final int STEPS=1000;40     //public static final int DELAY=100;41     public BounceFrame(){42         comp=new BallComponent();43         add(comp,BorderLayout.CENTER);44         JPanel buttonPanel=new JPanel();45         addButton(buttonPanel,"Start",new ActionListener(){46             public void actionPerformed(ActionEvent event){47                 addBall();48             }49         });50         addButton(buttonPanel,"Close",new ActionListener(){51             public void actionPerformed(ActionEvent event){52                 System.exit(0);53             }54         });55         add(buttonPanel,BorderLayout.SOUTH);56         pack();57     }58     public void addButton(Container c,String title,ActionListener listener){59         JButton button=new JButton(title);60         c.add(button);61         button.addActionListener(listener);62     }63     public void addBall(){64         Ball b=new Ball();65         comp.add(b);66         Runnable r=new BallRunnable(b,comp);67         Thread t=new Thread(r);68         t.start();69     }70     /*public void addBall(){71         try{72             Ball ball=new Ball();73             comp.add(ball);74             for(int i=1;i<=STEPS;i++){75                 ball.move(comp.getBounds());76                 comp.paint(comp.getGraphics());77                 Thread.sleep(DELAY);78             }79         }80         catch(InterruptedException e){}81     }*/82 }
View Code

 BollComponent.java

 1 package Thread; 2 import java.awt.*; 3  4 import java.util.*; 5 import javax.swing.*; 6 public class BallComponent extends JPanel{ 7     private static final int DEFAULT_WIDTH=450; 8     private static final int DEFAULT_HEIGHT=350; 9     private java.util.List<Ball>balls=new ArrayList<>();10     public void add(Ball b){11         balls.add(b);12     }13     public void paintComponent(Graphics g){14         super.paintComponent(g);15         Graphics2D g2=(Graphics2D)g;16         for(Ball b:balls){17             g2.fill(b.getShape());18         }19     }20     public Dimension getPreferredSize(){21         return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);22     }23 }
View Code

  Ball.java 

 1 package Thread; 2 import java.awt.geom.*; 3 import java.awt.geom.Ellipse2D.Double; 4 public class Ball { 5     private static final int XSIZE=15; 6     private static final int YSIZE=15; 7     private double x=0; 8     private double y=0; 9     private double dx=1;10     private double dy=1;11     public void move(Rectangle2D bounds){12         x+=dx;13         y+=dy;14         if(x<bounds.getMinX()){15             x=bounds.getMinX();16             dx=-dx;17         }18         if(x+XSIZE>=bounds.getMaxX()){19             x=bounds.getMaxX()-XSIZE;20             dx=-dx;21         }22         if(y<bounds.getMinY()){23             y=bounds.getMinY();24             dy=-dy;25         }26         if(y+YSIZE>=bounds.getMaxY()){27             y=bounds.getMaxY()-YSIZE;28             dy=-dy;29         }30     }31     public Ellipse2D getShape(){32         return new Ellipse2D.Double(x,y,XSIZE,YSIZE);33     }34 }
View Code

運行結果如下: 

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Java實(shí)現定時(shí)任務(wù)的三種方法
java線(xiàn)程概述 -- JR 精品文章
Java 并行框架總結(Concurrent)
中斷線(xiàn)程Interrupt與Interrupted的用處
Java 多線(xiàn)程編程 | 菜鳥(niǎo)教程
java Thread--娛樂(lè )Java
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久