线程个人学习知识

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接口的时候调用ThreadThread(Runnable run)或者Thread(Runnablerun,String name)构造方法创建进程时,使用同一个Runnable实例,建立的多线程的实例变量也是共享的;但是通过继承Thread类是不能用一个实例建立多个线程,故而实现Runnable接口适合于资源共享;当然,继承Thread类也能够共享变量,能共享Thread类的static变量;

 

              如果第二种实现Runnable接口的方式要想达到第一种继承Thread类的效果,可以这样来实例化线程类。

[java] view plain copy
  1. //MyThread2 mt = new MyThread2();  
  2. Thread t1 = new Threadnew MyThread2(),"一号窗口");  
  3. Thread t2 = new Threadnew MyThread2(),"二号窗口");  
  4. Thread t3 = new Thread(new MyThread2(),"三号窗口"); 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值