在淘寶做網(wǎng)站和網(wǎng)絡(luò)公司做網(wǎng)站區(qū)別深圳網(wǎng)站建設(shè)優(yōu)化
多線程
線程是操作系統(tǒng)能夠進(jìn)入運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。
進(jìn)程:是程序的基本執(zhí)行實(shí)體。
并發(fā):在同一個(gè)時(shí)刻,有多個(gè)指令在單個(gè)CPU上交替執(zhí)行。
并行:在同一時(shí)刻,有多個(gè)指令在多個(gè)CPU上同時(shí)執(zhí)行。
多線程的實(shí)現(xiàn)方式
1.繼承Thread類的方式進(jìn)行實(shí)現(xiàn)
package MyThread;public class MyThread extends Thread{@Overridepublic void run(){for (int i = 0; i < 100; i++) {System.out.println(getName()+"helloworld");}}
}
package MyThread;public class ThreadDemo {public static void main(String[] args) {
MyThread t1=new MyThread();MyThread t2=new MyThread();t1.setName("線程1");t2.setName("線程2");
t1.start();
t2.start();}
}
2.實(shí)現(xiàn)Runnable接口的方式進(jìn)行實(shí)現(xiàn)
package MyThread.a02ThreadDemo02;public class MyRun implements Runnable{@Overridepublic void run() {Thread t = Thread.currentThread();for (int i = 0; i < 100; i++) {System.out.println(t.getName()+"Helloworld");}}
}
package MyThread.a02ThreadDemo02;public class ThreadDemo {public static void main(String[] args) {MyRun mr=new MyRun();Thread t1=new Thread(mr);Thread t2=new Thread(mr);t1.setName("線程1");t2.setName("線程2");t1.start();t2.start();}
}
3.利用Callable接口和Future接口方式實(shí)現(xiàn)
package MyThread.a03ThreadDemo03;import java.util.concurrent.Callable;public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum=0;for (int i = 0; i < 100; i++) {sum=sum+i;}return sum;}
}
package MyThread.a03ThreadDemo03;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class ThreadDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable mc=new MyCallable();FutureTask<Integer> ft=new FutureTask<>(mc);Thread t1=new Thread();t1.start();Integer result = ft.get();System.out.println(result);}
}
常見(jiàn)的成員方法
package MyThread.a04ThreadDemo;public class MyThread extends Thread{public MyThread() {}
public MyThread(String name){super(name);
}@Overridepublic void run(){for (int i = 0; i < 100; i++) {System.out.println(getName()+"@"+i);}}
}
package MyThread.a04ThreadDemo;public class ThreadDemo {public static void main(String[] args) {//getName//1.如果我們沒(méi)有給線程設(shè)置名字,線程也是有默認(rèn)的名字的//格式:Thread-x(x序號(hào),從0開(kāi)始的)//2.如果我們要給線程設(shè)置名字,可以用set方法進(jìn)行設(shè)置,也可以用構(gòu)造方法//當(dāng)jvm虛擬機(jī)啟動(dòng)之后,會(huì)自動(dòng)的啟動(dòng)多條線程,其中有一條線程就叫main線程//它的作用就是調(diào)用main方法,并執(zhí)行里面的代碼/* MyThread t1=new MyThread();MyThread t2=new MyThread();MyThread t3=new MyThread("karry");MyThread t4=new MyThread("roy");t1.start();t2.start();*///哪條線程執(zhí)行到這個(gè)方法,此時(shí)獲取的就是哪條線程的對(duì)象
Thread t=new Thread();String name = t.getName();System.out.println(name);}
}
線程的優(yōu)先級(jí)
package MyThread.a05threadDEMO;public class MyRun implements Runnable{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName()+i);}}
}
package MyThread.a05threadDEMO;public class ThreadDemo {public static void main(String[] args) {MyRun mr=new MyRun();Thread t1=new Thread(mr,"karry");Thread t2=new Thread(mr,"roy");System.out.println(t1.getPriority());System.out.println(t2.getPriority());t1.setPriority(1);t2.setPriority(10);t1.start();t2.start();}
}
守護(hù)線程
package MyThread.a06threaddemo;public class MyThread1 extends Thread{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(getName()+"@"+i);}}
}
package MyThread.a06threaddemo;public class MyThread2 extends Thread{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(getName()+"@"+i);}}
}package MyThread.a06threaddemo;import MyThread.a04ThreadDemo.MyThread;public class ThreadDemo {public static void main(String[] args) {MyThread1 t1=new MyThread1();MyThread2 t2=new MyThread2();t1.setName("karry");t2.setName("roy");t2.setDaemon(true);t1.start();t2.start();}
}