zoukankan      html  css  js  c++  java
  • 多线程的创建的使用

    一,进程与线程

    进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

    线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

    简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

    什么是多线程呢?即就是一个程序中有多个线程在同时执行。

            单线程程序:即,若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。如,去网吧上网,网吧只能让一个人上网,当这个人下机后,下一个人才能上网。

           多线程程序:即,若有多个任务可以同时执行。如,去网吧上网,网吧能够让多个人同时上网。

     

    二,多线程的创建

    第一种方法:   继承Thread类,重写run方法
    
    public class Demo01 {
        public static void main(String[] args) {
            //创建自定义线程对象
            
            //在主方法中执行for循环
            for (int i = 0; i < 10; i++) {
                System.out.println("main线程!"+i);
            }
            MyThread1 mt = new MyThread1();
            //开启新线程
            mt.start();
        }
    }
     class MyThread1 extends Thread {
        //定义指定线程名称的构造方法
        
        /**
         * 重写run方法,完成该线程执行的逻辑
         */
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName()+":正在执行!"+i);
            }
        }
    }
    第二种方法:实现Runnable接口,重写run方法,然后把实现类传到一个Thread类中。
    
    public class Demo03 {
    
        public static void main(String[] args) {
            Runn r1 = new Runn();
            Thread t1 = new Thread(r1);
            Thread t2 = new Thread(r1);
            t1.start();
            t2.start();
            for(int i=0;i<20;i++)
            {
                System.out.println(Thread.currentThread().getName()+" : "+i);
            }
        }
    }
    
    class Runn implements Runnable{
    
        @Override
        public void run() {
            for(int i=0;i<20;i++)
            {
                System.out.println(Thread.currentThread().getName()+" : "+i);
            }
        }
        
    }
    线程匿名内部类的使用:节省了代码行数
    
    方式1:创建线程对象时,直接重写Thread类中的run方法
            new Thread() {
                public void run() {
                    for (int x = 0; x < 40; x++) {
                        
                         System.out.println(Thread.currentThread().getName()
                                + "...X...." + x);
                    }
                }
            }.start();
    
    方式2:使用匿名内部类的方式实现Runnable接口,重新Runnable接口中的run方法
           Runnable r = new Runnable() {
            public void run() {
                    for (int x = 0; x < 40; x++) {
                        System.out.println(Thread.currentThread().getName()
                                + "...Y...." + x);
                    }
                }
            };
            new Thread(r).start();

    三,线程池

      线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

    public class ThreadPoolDemo {
        public static void main(String[] args) {
            //创建线程池对象
            ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象
            //创建Runnable实例对象
            MyRunnable r = new MyRunnable();
            
            //自己创建线程对象的方式
            //Thread t = new Thread(r);
            //t.start(); ---> 调用MyRunnable中的run()
            
            //从线程池中获取线程对象,然后调用MyRunnable中的run()
            service.submit(r);
            //再获取个线程对象,调用MyRunnable中的run()
            service.submit(r);
            service.submit(r);
    //注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中
    
    //关闭线程池
            //service.shutdown();
        }
    }
    //Runnable接口实现类
    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("我要一个教练");
            
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("教练来了: " +Thread.currentThread().getName());
            System.out.println("教我游泳,交完后,教练回到了游泳池");
        }
    }
    //通过实现一个Callable也可以实现run方法,并且可以通过Future对象获取返回值
    public class ThreadPoolDemo { public static void main(String[] args) throws InterruptedException, ExecutionException { //创建线程池对象 ExecutorService threadPool = Executors.newFixedThreadPool(2); //创建一个Callable接口子类对象 //MyCallable c = new MyCallable(); MyCallable c = new MyCallable(100, 200); MyCallable c2 = new MyCallable(10, 20); //获取线程池中的线程,调用Callable接口子类对象中的call()方法, 完成求和操作 //<Integer> Future<Integer> submit(Callable<Integer> task) // Future 结果对象 Future<Integer> result = threadPool.submit(c); //此 Future 的 get 方法所返回的结果类型 Integer sum = result.get(); System.out.println("sum=" + sum); //再演示 result = threadPool.submit(c2); sum = result.get(); System.out.println("sum=" + sum); //关闭线程池(可以不关闭) } } //Callable接口实现类 public class MyCallable implements Callable<Integer> { //成员变量 int x = 5; int y = 3; //构造方法 public MyCallable(){ } public MyCallable(int x, int y){ this.x = x; this.y = y; } @Override public Integer call() throws Exception { return x+y; } }

      

  • 相关阅读:
    layui的table使用,二
    将字符串中的以某个字符间隔放到数组中
    oracle中的 函数应用
    spring 的3种常用的注入方式
    写一个方法,输入两个正整数,输出在两个正整数范围内即被3整除,又被7整除的正整数
    Myeclipse 10.7配置egit及导入项目
    Plsqi安装
    web项目引入js包时,报syntax error on token
    java笔试面试题总结
    web.xml中的配置
  • 原文地址:https://www.cnblogs.com/ithome0222/p/8747982.html
Copyright © 2011-2022 走看看