進(jìn)程與線程的概念:
進(jìn)程:操作系統(tǒng)中,一個(gè)程序的執(zhí)行周期稱為一個(gè)進(jìn)程
線程:一個(gè)程序同時(shí)執(zhí)行多個(gè)任務(wù)的時(shí)候,我們把每一任務(wù)稱作一個(gè)線程
進(jìn)程與線程相比較,線程更”輕量級(jí)“,創(chuàng)建、撤銷一個(gè)線程比啟動(dòng)一個(gè)進(jìn)程開(kāi)銷要小的多。但是,沒(méi)有進(jìn)程就沒(méi)有線程,進(jìn)程一旦終止,其內(nèi)的線程也不再存在。
多線程與多進(jìn)程的區(qū)別:
每個(gè)進(jìn)程都擁有自己的完整變量,而線程之間則共享數(shù)據(jù)。共享數(shù)據(jù)使得線程間通信更加方便、有效。
1、繼承Thread類實(shí)現(xiàn)多線程
class MyThread extends Thread{//定義線程主體類 private String title; public MyThread(String title){ this.title = title; } @Override public void run(){ for(int i = 0; i < 10; i ){ System.out.println(this.title " i = " i); } }}public class ThreadTest { public static void main(String[] args) { MyThread myThread1 = new MyThread("線程1");//創(chuàng)建新線程 MyThread myThread2 = new MyThread("線程2"); MyThread myThread3 = new MyThread("線程3"); myThread1.run();//啟動(dòng)線程 myThread2.run(); myThread3.run(); }}
運(yùn)行結(jié)果:
public static void main(String[] args) { MyThread myThread1 = new MyThread("線程1"); MyThread myThread2 = new MyThread("線程2"); MyThread myThread3 = new MyThread("線程3"); myThread1.start(); myThread2.start(); myThread3.start();}
此時(shí)線程變?yōu)榻惶鎴?zhí)行
class MyThread implements Runnable{ private String title; public MyThread(String title){ this.title = title; } @Override public void run() { for(int i = 0; i < 10; i ){ System.out.println(this.title " i = " i); } }}public class ThreadTest { public static void main(String[] args) { MyThread myThread1 = new MyThread("線程1"); MyThread myThread2 = new MyThread("線程2"); MyThread myThread3 = new MyThread("線程3"); new Thread(myThread1).start(); new Thread(myThread2).start(); new Thread(myThread3).start(); }}
b、使用Runnable實(shí)現(xiàn)的多線程的程序類可以更好的描述出程序共享的概念
3、Callable實(shí)現(xiàn)多線程
class MyThread implements Callable<String>{ private int tickets = 10; @Override public String call() throws Exception { while (this.tickets >= 0){ System.out.println("剩余票數(shù)為:" this.tickets--); } return "票賣完了"; }}public class ThreadTest { public static void main(String[] args) throws InterruptedException,ExecutionException { FutureTask<String> task = new FutureTask<>(new MyThread()); new Thread(task).start(); new Thread(task).start(); System.out.println(task.get()); }}
通過(guò)繼承Callable來(lái)實(shí)現(xiàn)多線程的特點(diǎn):可以取得線程執(zhí)行結(jié)果,具有返回值
聯(lián)系客服