Java 多线程一:继承Thread类和实现Runnable接口

 关于进程核线程的区别,这里不佳赘述,大家只要知道,进程里包含很多线程,进程是资源分配的最小单位,线程是执行的最小单位。且程序被执行才可以有线程和进程的概念,程序是静态的,进程和线程是动态的。

Java 中线程一般有两种实现方式,分别是继承Thread类和实现Runnable 接口,这里先对继承和接口的实现的作简要的实例分析。注意:用的比较多的是使用接口实现的方法。

1继承Thread类 实例代码:

/*
 * 继承Thread类
 * 常用方法有:
 *   1 start():启动线程 并执行相应的run方法
 *   2 run():在继承Thread类后需要重写,将子线程需要执行的的方法放入
 *   3 直接Thread.currentThread():其为静态方法,
 *   4 getName():获得线程名字
 *   5 setName():设置线程名字
 *   6 yield():执行后,会让当前线程放弃CPU执行权,让其它线程执行,但是释放马上又会去抢
 *   7 join():执行后,会让当前线程放弃CPU执行权,让其它线程执行,并且是执行完
 *   8 isAlive():看当前线程是否存活(布尔型)
 *   9 sleep(long l):显式让程序睡眠l 毫秒 会有异常 只能try catch
 *   10 线程通信: wait() notify() notifyAll()
 *   11 设置线程优先级:get/setPriority()
 */
public class TestThread {
    public static void main(String[] args) {
        //创建一个线程对象
        SubThread sub=new SubThread();
        SubThread sub1=new SubThread();//在创建一个线程
        sub.setPriority(Thread.MAX_PRIORITY);//最大优先级
        sub.setName("test1");//设置线程名
        sub.start();//1 使线程执行 2 调用run方法
        //sub.run();//直接使用run方法没有start不算多线程 那样相当于有主函数直接调用了run
        System.out.println("9999");
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"====="+i);
            if(i%20==0) {
                try {
                    sub.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println(sub.isAlive());
        }
    }
    
}

class SubThread extends Thread{
    //重写了run()方法
    public void run() {
        for(int i=0;i<100;i++) {
            try {
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"--"+i);
        }
    }
}

2 下面写了一个小例子,模仿车站窗口售票的例子,大家可以看下具体应用:

//模拟车站三个窗口售票
public class Test4 {
    public static void main(String[] args) {
        WinThread w1=new WinThread();
        WinThread w2=new WinThread();
        WinThread w3=new WinThread();
        w1.setName("Win 1");
        w2.setName("Win 2");
        w3.setName("Win 3");
        w1.start();
        w2.start();
        w3.start();
    }
}
class WinThread extends Thread{
    private static int tickets= 100;
    public void run() {
        while(tickets>0) {
            System.out.println(Thread.currentThread().getName()+" 售票 "+tickets--);
        }
        
    }
}

3 结合上例 用实现Runnable接口来实现

public static void main(String[] args) {
        
        WinThread1 w1=new WinThread1();//接口中没有start方法
        Thread t1=new Thread(w1);//将接口实现和线程Thread发生关系
        Thread t2=new Thread(w1);//将接口实现和线程Thread发生关系
        t1.start();
        t2.start();
        
    }

class WinThread1 implements Runnable {

    int tickets= 100;//z注意这里 tickets 不是静态的
    public void run() {
        while(tickets>0) {
            System.out.println(Thread.currentThread().getName()+" 售票 "+tickets--);
        }
        
    }
    
}

通过对比,可以发现:继承和接口实现两者:接口实现更好:
        1 避免了Java单继承的缺陷

        2只需创建一个实例 方便线程共享数据的操作

希望对大家有帮助!有问题欢迎一起指证探讨

猜你喜欢

转载自blog.csdn.net/qq_29750461/article/details/81188134