java 多线程

admin 2020年05月13日 •  教程 Java 299
本文最后修改于 398 天前,部分内容可能已经过时!

多线程

线程的3种创建

  • 集成Thread 类
  • 实现Runnable接口
  • 实现callable接口

创建线程方式一

继承thread类 重写run方法 调用start方法开启线程

public class TestThread extends Thread {

    @Override
    public void run() {
        //run方法 线程题
        for (int i = 0; i < 20; i++) {
            System.out.println("i run线程= " + i);
        }
    }

    public static void main(String[] args) {
        //创建多线程的对象
        TestThread testThread = new TestThread();
        //开启线程
        testThread.start();
        //main 线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("i main线程= " + i);
        }
    }
}

运行结果:

mark

总结 方法调用时一定调用 [start]()方法

注意线程开启不一定立即执行 由cpu调度执行

创建线程方式二

public class TestRunnable  implements Runnable{


    public void run() {
        //run方法 线程题
        for (int i = 0; i < 20; i++) {
            System.out.println("i run线程= " + i);
        }
    }

    public static void main(String[] args) {


        TestRunnable testRunnable = new TestRunnable();
        Thread thread = new Thread(testRunnable);
        thread.start();
        //main 线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("i main线程= " + i);
        }
    }
}

与继承Therad类的区别

两种方法都是重写实现run方法 线程体都是一样的

启动方式:

runnable 接口 是先new Thread 把实现runnable接口的类传入Thread 类 进行start 调用 ,,, 如 new Thread(类).staer();

运行结果

mark

mark

创建线程方式三

与前面两种方式不同

mark

实现callable 接口 企业级(瞎说的)应用的多

他的可多用性 返回值 可任意类型 线程池

代码实现

class TesTCallable implements Callable<Integer>{

    public Integer call() throws Exception {
        for (int i = 0; i < 200; i++) {
            System.out.println("i call线程体= " + i);
        }
        return 1;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TesTCallable tesTCallable = new TesTCallable();


        //首先需要创建线程
        ExecutorService ser = Executors.newFixedThreadPool(3);

        //运行线程体
        Future<Integer> submit = ser.submit(tesTCallable);
        for (int i = 0; i < 2000; i++) {
            System.out.println("i 我是主线程= " + i);
        }
        //获取返回值  这里可以选择获取异常或者抛出
        Integer integer = submit.get();
        System.out.println("integer = " + integer);


        ser.shutdownNow();




    }
}

运行结果 交叉输出

mark

Thread 原理

thread 原理基于静态代理模式 java设计模式的一种

mark

Thread类 同样实现了Runnable接口 重写了 run()方法

mark

启动线程 start()方法

比如: 房东 要出租房子

​ 你要 租房子

这个时候静态代理就来了 (中介)

这个中介就可以说是静态代理

房东找→中介出租房子 房东只管出租房子 不需要管任何事务 比如签合同带你去看房子,这些 都是中介来完成 ,房东只负责单一业务

你 →找中介租房子 你也只管租房子,不需要管合同 一系列复杂的事情 只管找中介租房子 其余的全部由中介负责

Lamda 表达式 实现多线程

mark

lambda 简化过程

/*推导lambda 表达式*/
public class TestLambda {

    //3.静态内部类
    static class Like2 implements  ILike{

        public void lambda() {
            System.out.println("I Like Lambda2");
        }
    }

    public static void main(String[] args) {
        ILike iLike = new Like();
        iLike.lambda();
        iLike= new Like2();
        iLike.lambda();
        //4.局部内部类   类在方法体内
        class Like3 implements  ILike{
            public void lambda() {
                System.out.println("I Like Lambda3");
            }
        }
        iLike= new Like3();
        iLike.lambda();


        //5.匿名内部类

        iLike = new ILike() {
            public void lambda() {
                System.out.println("I Like Lambda4");
            }
        } ;
        iLike.lambda();
        //6.lambda  简化
        iLike = ()->{
            System.out.println("I Like Lambda5");
        };
        iLike.lambda();

    }

}
//1.定义一个函数式接口
interface ILike{

    void lambda();
}

//2.实现函数式接口 类
class Like implements  ILike{

    public void lambda() {
        System.out.println("I Like Lambda");
    }
}

线程状态

  • 创建状态
  • 就绪状态
  • 阻塞状态
  • 运行状态
  • 死亡状态

mark

更详细的图

mark

线程的方法

mark

Tags:java多线程
上一篇
下一篇

添加新评论

已有 299 条评论

 Yonreata 8 个月前 • |

lasix 20 mg cymbalta pills plaquenil 200 mg 60 tab medrol 4mg price effexor tablets 75mg

 Denreata 8 个月前 • |

baclofen lioresal online drugstore metformin proscar prescription online finpecia tablet online buy vermox 500mg

 Jasonreata 8 个月前 • |

finpecia online anafranil cost viagra fast shipping canada clindamycin gel generic cheap viagra online no prescription buy stromectol online uk buy ivermectin pills phenergan tablets 10 mg glucophage online prescription paxil blood pressure

 Alanreata 8 个月前 • |

cipro online stromectol 12mg online propranolol no prescription how to get propranolol prescription viagra 100mg price in india online tadacip 5mg price advair brand name where to purchase cialis bactrim 800 mg cost amoxicillin 400mg cost chlorquin sildenafil canada otc can you buy wellbutrin online sildenafil 50mg buy cost of 40 mg strattera where can i buy cheap viagra online viagra pills generic brand ciprofloxacin 500mg for sale periactin tablets uk hydroxychloroquine plaquenil

 Paulreata 8 个月前 • |

citalopram hbr 20 mg for anxiety silagra 50 mg price in india propranolol 10 mg pill where to buy viagra over the counter usa sildalis

 Tedreata 8 个月前 • |

chloroquine ph 500 mg tablet citalopram 100mg cost of 500 mg amoxicillin strattera 25 price of viagra compare generic viagra prices

 Teoreata 8 个月前 • |

metformin price in india

 Judyreata 8 个月前 • |

zanaflex 16 mg buy sildenafil 100mg plaquenil discount canadian viagra 200 mg plaquenil tablet canada silagra 100 prazosin 2mg inderal 40 mg tablet sildenafil buy online canada trental 400 mg price in india

 Booreata 8 个月前 • |

cheapest advair diskus chloroquine brand name india generic cialis in australia buy oral flagyl antibiotic

 Ashreata 8 个月前 • |

plaquenil eye damage sumycin price kamagra 100mg for sale cymbalta 90 malegra dxt without prescription phenergan cream south africa buy cheap sildenafil online uk cost of antabuse in canada