Java基础巩固(二)

打印 上一主题 下一主题

主题 1041|帖子 1041|积分 3123

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Java基础巩固(二)——多线程

1.基本概念


  • 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
  • 进程是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。
  • 一个进程可以包含若干个线程,线程是cpu调度和执行的单位。
  • 进程是资源分配的最小单位,线程是程序执行的最小单位;
  • 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程、gc线程;
  • 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能认为干预的;
2.线程的创建方式


  • 通过继承Thread类来创建
  1. //创建线程方式一:继承Thread类,重写run()方法
  2. public class ThreadPractice extends Thread {
  3.     @Override
  4.     public void run() {
  5.         for (int i = 0; i < 20; i++) {
  6.             System.out.println("正在运行线程一__" + i);
  7.         }
  8.     }
  9.     public static void main(String[] args) {
  10.         for (int i = 0; i < 200; i++) {
  11.             System.out.println("正在运行       主线程__" + i);
  12.         }
  13. /* xx.start()和xx.run()是不同的,前者是创建进程,后者是运行任务,前者线程与主线程同时进行,后者根据主线程中的顺序先后进行 */
  14.         ThreadPractice thread1 = new ThreadPractice();
  15.         thread1.start();        
  16. //      thread1.run();
  17.     }
  18. }
复制代码

  • 通过实现Runnable接口来创建(可以实现多个线程对同一个对象的调用,避免了单继承的局限性)
  1. //创建线程方式二:实现Runnable接口
  2. public class ThreadPractice3 implements Runnable {
  3.     @Override
  4.     public void run() {
  5.         for (int i = 0; i < 20; i++) {
  6.             System.out.println("正在运行线程一__" + i);
  7.         }
  8.     }
  9.     public static void main(String[] args) {
  10.         for (int i = 0; i < 200; i++) {
  11.             System.out.println("正在运行       主线程__" + i);
  12.         }
  13.         ThreadPractice3 thread1 = new ThreadPractice3();
  14.         new Thread(thread1).start();
  15.     }
  16. }
复制代码

  • 通过实现Callable接口来创建(优点是可以定义返回值类型,抛出异常)
  1. public class ThreadPractice4 implements Callable<Boolean> {
  2.     private String name;
  3.     private int age;
  4.     public ThreadPractice4(String name, int age) {
  5.         this.name = name;
  6.         this.age = age;
  7.     }
  8.     @Override
  9.     public Boolean call() {
  10.         test test1 = new test();
  11.         test1.Show(name, age);
  12.         return true;
  13.     }
  14.     public static void main(String[] args) throws ExecutionException, InterruptedException {
  15.         ThreadPractice4 thread1 = new ThreadPractice4("小白",15);
  16.         ThreadPractice4 thread2 = new ThreadPractice4("小黑",20);
  17.         ThreadPractice4 thread3 = new ThreadPractice4("小红",30);
  18.         //创建执行服务
  19.         ExecutorService service = Executors.newFixedThreadPool(3);
  20.         //提交执行
  21.         Future<Boolean> r1 = service.submit(thread1);
  22.         Future<Boolean> r2 = service.submit(thread2);
  23.         Future<Boolean> r3 = service.submit(thread3);
  24.         //获取结果
  25.         boolean rs1 = r1.get();
  26.         boolean rs2 = r2.get();
  27.         boolean rs3 = r3.get();
  28.         System.out.println(rs1);
  29.         System.out.println(rs2);
  30.         System.out.println(rs3);
  31.         //关闭服务
  32.         service.shutdownNow();
  33.     }
  34. }
  35. class test {
  36.     public void Show(String name, int age) {
  37.         System.out.println("这个人叫" + name + ",今年" + age + "岁。");
  38.     }
  39. }
复制代码
此方法总结为以下几步:

  • 实现Callable接口,需要返回值类型,例如上诉例子的Boolean
  • 重写call方法,需要抛出异常
  • 创建目标对象
  • 创建执行服务:ExecutorService service = Executors.newFixedThreadPool(1);
  • 提交执行:Future r1= service.submit(t1);
  • 获取结果:boolean rs1 = r1.get();
  • 关闭服务:service.shutdownNow();
3.lambda表达式(包括五种类的演示)
  1. interface Ilove{
  2.     void love(int a);
  3. }
  4. //第一种,正常类
  5. class Love implements Ilove {
  6.     @Override
  7.     public void love(int a) {
  8.         System.out.println("i love  ->" + a);
  9.     }
  10. }
  11. public class TestLambda {
  12.     //第二种,静态内部类
  13.     static class Love2 implements Ilove {
  14.         @Override
  15.         public void love(int a) {
  16.             System.out.println("i love2 ->" + a);
  17.         }
  18.     }
  19.     public static void main(String[] args) {
  20.         Ilove ilove = new Love();
  21.         ilove.love(2);
  22.         Ilove ilove2 = new Love2();
  23.         ilove2.love(2);
  24.         //第三种,局部内部类
  25.         class Love3 implements Ilove {
  26.             @Override
  27.             public void love(int a) {
  28.                 System.out.println("i love3 ->" + a);
  29.             }
  30.         }
  31.         Ilove ilove3 = new Love3();
  32.         ilove3.love(2);
  33.         //第四种,匿名内部类
  34.         Ilove ilove4 = new Ilove() {
  35.             @Override
  36.             public void love(int a) {
  37.                 System.out.println("i love4 ->" + a);
  38.             }
  39.         };
  40.         ilove4.love(2);
  41.         //第五种,lambda表达式
  42.         Ilove ilove5 = (int a) -> {
  43.             System.out.println("i love5 ->" + a);
  44.         };
  45.         ilove5.love(2);
  46.     }
  47. }
复制代码
4.线程状态

创建、就绪、运行、阻塞、死亡
线程操作:

  • 线程礼让,Thread.yield()
  • 线程插队,Thread.join()
  • 线程等待,Thread.sleep()
  • 线程优先级,Thread.setPriority()、getPriority()
  • 线程状态,Thread.getState()
  • 守护线程,Thread.setDaemon()
5.线程同步

synchronized
6.线程协作


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表