美文网首页
多线程的三种实现方式、三种内部类写法、常见函数使用举例

多线程的三种实现方式、三种内部类写法、常见函数使用举例

作者: 笑才 | 来源:发表于2018-10-26 00:24 被阅读0次

1、继承Thread类

public class ThreadTest01 {

    public static void main(String[] args) {
        MyThread myThread1 = new MyThread("周星驰");
        MyThread myThread2 = new MyThread("成龙");
        myThread1.start();
        myThread2.start();
    }
}
1.1、继承Thread类
1.2、复写run方法
1.3、new 新的类对象
1.4、调用新类的start方法
class MyThread extends Thread{
    private String name;
    public MyThread(String name){
        this.name = name;
    }
    public void run(){
        for(int i=0;i<100;i++){
            try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
            System.out.println("------>"+name+"--->"+i);
        }
    }
}

2、实现Runnable接口(使用静态代理的方式实现的)

public class ThreadTest02 {
    public static void main(String[] args) {
        MyThread02 myThread1 = new MyThread02("周星驰");
        MyThread02 myThread2 = new MyThread02("成龙");
        Thread thread1 = new Thread(myThread1);
        Thread thread2 = new Thread(myThread2);
        thread1.start();
        thread2.start();
    }
}
2.1、实现Runnable接口
2.2、复写run方法
2.3、new 新的类对象
2.4、new一个Thread对象(传入上面的对象)
2.5、Thread对象调用start方法启动线程
class MyThread02 implements Runnable{
    private String name;
    public MyThread02(String name){
        this.name = name;
    }
    public void run() {
        for(int i=0;i<100;i++){
            try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
            System.out.println("------>"+name+"--->"+i);
        }
    }
}

3、实现Callable接口

public class ThreadTest03 {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService ser = Executors.newFixedThreadPool(2);
        MyThread03 myThread1 = new MyThread03("周星驰");
        MyThread03 myThread2 = new MyThread03("成龙");
        Future<String> future1 =ser.submit(myThread1);
        Future<String> future2 =ser.submit(myThread2);
        Thread.sleep(5000);
        myThread1.setFlag(false);
        myThread2.setFlag(false);
        String result1 =future1.get();
        String result2 =future2.get();
        System.out.println("-----------------------");
        System.out.println(result1);
        System.out.println(result2);
                ser.shutdownNow();
    }
}
3.1、实现Callable接口
3.2、复写call方法(返回值类型需与Callable接口的泛型一致)
3.3、ExecutorService ser = Executors.newFixedThreadPool(2)创建一个线程池,用于启动线程
3.4、new一个线程对象
3.5、定义一个Future类型的参数接受线程池提交的线程对象后的“未来值”
3.6、通过Future的get()方法,获取到线程返回的值,该方法会阻塞线程,即调用该方法后,主线程会等到新启的线程
结束拿到结果后,才会执行后面的代码
3.7、调用shutdownNow()方法,关闭线程池(否则主线程不会结束)
class MyThread03 implements Callable<String>{
    private String name;
    private boolean flag =true;
    public MyThread03(String name){
        this.name = name;
    }
    public String call() throws Exception {
        int i = 0;
        while(flag){
            try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
            i++;
            System.out.println("------>"+name+"--->"+i);
        }
        return name;
    }
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

4、三种特殊写法

public class ThreadTest04 {
    public static void main(String[] args) {
        new Thread(){
            private String name ="周星驰";
            public void run(){
                for(int i=0;i<100;i++){
                    try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
                    System.out.println("------>"+name+"--->"+i);
                }
            }
        }.start();
        
        new Thread(new Runnable(){
            private String name ="成龙";
            public void run() {
                for(int i=0;i<100;i++){
                    try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
                    System.out.println("------>"+name+"--->"+i);
                }
            }
        }).start();

                new Thread(new Thread(){
            private String name ="李连杰";
            public void run() {
                for(int i=0;i<100;i++){
                    try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
                    System.out.println("------>"+name+"--->"+i);
                }
            }
        }).start();
    }
}

5、Join()方法,合并线程,是把被调用的线程合并到主线程中,并行变串行,主线程进入等待,直到被合并进来的线程执行完后,主线程才继续进行

public class ThreadTest05 extends Thread{
    private String name;
    public ThreadTest05(String name){
        this.name = name;
    }
    public static void main(String[] args) {
        ThreadTest05 threadTest05 = new ThreadTest05("成龙");
        Thread thread = new Thread(threadTest05);
        thread.start();
        
        for(int i=0;i<100;i++){
            if(i==50){try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}}
            try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
            System.out.println("------>main--->"+i);
        }
    }
    
    public void run(){
        for(int i=0;i<100;i++){
            try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
            System.out.println("------>"+name+"--->"+i);
        }
    }
}

此程序先是两线程一起跑,等到主线程I==50时,主线程停下,等待子线程thread执行完,主线程才继续执行

6、yield()方法,暂停线程(把自己的CPU时间片让出),直到CPU再分给时间片才会继续运行,此方法为static方法,Thread.yield(),写在哪个线程,哪个线程就暂停,与sleep相似

public class ThreadTest06 extends Thread{
    private String name;
    public ThreadTest06(String name){
        this.name = name;
    }
    public static void main(String[] args) {
        ThreadTest06 threadTest06 = new ThreadTest06("成龙");
        Thread thread = new Thread(threadTest06);
        thread.start();
        
        for(int i=1;i<100;i++){
            if(i%20==0){Thread.yield();}
            System.out.println("------>main--->"+i);
        }
    }
    
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("------>"+name+"--->"+i);
        }
    }
}

7、Sleep()方法,让线程睡眠,static方法,太常见,例子略
Thread.currentThread()获取当前线程static方法,thread.setName("name")给线程设置名称,thread.getName()获取线程名称
thread.isAlive()判断线程是否是存活状态

相关文章

网友评论

      本文标题:多线程的三种实现方式、三种内部类写法、常见函数使用举例

      本文链接:https://www.haomeiwen.com/subject/uqphtqtx.html