1:创建线程类:一种方法是直接继承Thread类,继承之后就可以调用线程方法;第二种即为先实现Runnable接口,然后使用 Thread thread=new Thread (new Listoff ());以上thread即为线程实例;第二种方法较为常见,且第二种方法多个线程可以共享一个线程类的static 变量;
//第二种方法使用
public class Listoff implements Runnable{
public int countdown=10;
private static int taskcount=0;
private final int id=taskcount++;
public Listoff(int countdown){
this.countdown=countdown;
}
public Listoff(){
this.countdown=countdown;
}
public String status (){
return "#"+id+"("+(countdown>0?+countdown:"Listoff!")+")";
}
public void run(){
while(countdown-->0){
System.out.println(status());
Thread.yield();//让步方法,让其他的线程去执行
}
}
}
2:实现线程类
public class BasicThread {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<=5;i++){
new Thread(new Listoff()).start(); //start为启动线程,之后回去调用线程的线程执行体润()方法 //直接调用run()方法,就和普通调用方法没有区别,一般线程体执行就是start之后,自动执行
}
System.out.println("waitListoff");//此为主线程中内容,无需等待线程st的执行顺序,一般会提前执行
}
}
3:使用线程池管理多线程
public class CacheThreadpool {
public static void main(String[] args) {
//newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
ExecutorService exec=Executors.newCachedThreadPool();
for(int i=0;i<=5;i++)exec.execute(new Listoff());
exec.shutdown();
//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
ExecutorService exec1=Executors.newFixedThreadPool(10);
exec1.execute(new Listoff());
exec.shutdown();
//newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
//按顺序执行线程
ExecutorService exec2=Executors.newSingleThreadExecutor();
for(int i=0;i<=5;i++)exec2.execute(new Listoff());
exec2.shutdown();
//newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
}
}
其实,第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMyThread的时候在创建三个对象的同时创建了三个线程;实现Runnable的, 相当于是拿出一个卖早餐10份的任务给三个人去共同完成,newMyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行。
一个类只能继承一个父类,存在局限;一个类可以实现多个接口。在实现Runnable接口的时候调用Thread的Thread(Runnable run)或者Thread(Runnablerun,String name)构造方法创建进程时,使用同一个Runnable实例,建立的多线程的实例变量也是共享的;但是通过继承Thread类是不能用一个实例建立多个线程,故而实现Runnable接口适合于资源共享;当然,继承Thread类也能够共享变量,能共享Thread类的static变量;
如果第二种实现Runnable接口的方式要想达到第一种继承Thread类的效果,可以这样来实例化线程类。
- //MyThread2 mt = new MyThread2();
- Thread t1 = new Threadnew MyThread2(),"一号窗口");
- Thread t2 = new Threadnew MyThread2(),"二号窗口");
- Thread t3 = new Thread(new MyThread2(),"三号窗口");