精华内容
下载资源
问答
  • // 将Runnable实现类作为Thread的构造参数传递到Thread类中,然后启动Thread类 MyRunnable runnable = new MyRunnable(); new Thread(runnable).start(); } } class MyRunnable implements Runnable { @...
  • 线程创建的四种方式

    万次阅读 多人点赞 2018-03-30 14:34:14
    java中创建线程的四种方法以及区别 ...2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 4)使用线程池例如用Executor框架 下面让我们分别来看看这四种创建线程的方法。 --...

    java中创建线程的四种方法以及区别

    Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示:

    1)继承Thread类创建线程

    2)实现Runnable接口创建线程

    3)使用Callable和Future创建线程

    4)使用线程池例如用Executor框架

    下面让我们分别来看看这四种创建线程的方法。

    ------------------------继承Thread类创建线程---------------------

    通过继承Thread类来创建并启动多线程的一般步骤如下

    1】d定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。

    2】创建Thread子类的实例,也就是创建了线程对象

    3】启动线程,即调用线程的start()方法

    代码实例

    public class MyThread extends Thread{//继承Thread类

      public void run(){

      //重写run方法

      }

    }

    public class Main {

      public static void main(String[] args){

        new MyThread().start();//创建并启动线程

      }

    }

    ------------------------实现Runnable接口创建线程---------------------

    通过实现Runnable接口创建并启动线程一般步骤如下:

    1】定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体

    2】创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象

    3】第三部依然是通过调用线程对象的start()方法来启动线程

    代码实例:

    public class MyThread2 implements Runnable {//实现Runnable接口

      public void run(){

      //重写run方法

      }

    }

    public class Main {

      public static void main(String[] args){

        //创建并启动线程

        MyThread2 myThread=new MyThread2();

        Thread thread=new Thread(myThread);

        thread().start();

        //或者    new Thread(new MyThread2()).start();

      }

    }

    ------------------------使用Callable和Future创建线程---------------------

    和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要强大。

    》call()方法可以有返回值

    》call()方法可以声明抛出异常

    Java5提供了Future接口来代表Callable接口里call()方法的返回值,并且为Future接口提供了一个实现类FutureTask,这个实现类既实现了Future接口,还实现了Runnable接口,因此可以作为Thread类的target。在Future接口里定义了几个公共方法来控制它关联的Callable任务。

    >boolean cancel(boolean mayInterruptIfRunning):视图取消该Future里面关联的Callable任务

    >V get():返回Callable里call()方法的返回值,调用这个方法会导致程序阻塞,必须等到子线程结束后才会得到返回值

    >V get(long timeout,TimeUnit unit):返回Callable里call()方法的返回值,最多阻塞timeout时间,经过指定时间没有返回抛出TimeoutException

    >boolean isDone():若Callable任务完成,返回True

    >boolean isCancelled():如果在Callable任务正常完成前被取消,返回True

    介绍了相关的概念之后,创建并启动有返回值的线程的步骤如下:

    1】创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)。

    2】使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值

    3】使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)

    4】调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

    代码实例:

    public class Main {

      public static void main(String[] args){

       MyThread3 th=new MyThread3();

       //使用Lambda表达式创建Callable对象

         //使用FutureTask类来包装Callable对象

       FutureTask<Integer> future=new FutureTask<Integer>(

        (Callable<Integer>)()->{

          return 5;

        }

        );

       new Thread(task,"有返回值的线程").start();//实质上还是以Callable对象来创建并启动线程

        try{

        System.out.println("子线程的返回值:"+future.get());//get()方法会阻塞,直到子线程执行结束才返回

        }catch(Exception e){

        ex.printStackTrace();

       }

      }

    }

    ------------------------使用线程池例如用Executor框架---------------------

    1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦。要执行任务的人只需把Task描述清楚,然后提交即可。这个Task是怎么被执行的,被谁执行的,什么时候执行的,提交的人就不用关心了。具体点讲,提交一个Callable对象给ExecutorService(如最常用的线程池ThreadPoolExecutor),将得到一个Future对象,调用Future对象的get方法等待执行结果就好了。Executor框架的内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。

        Executor框架包括:线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。

        Executor接口中之定义了一个方法execute(Runnable command),该方法接收一个Runable实例,它用来执行一个任务,任务即一个实现了Runnable接口的类。ExecutorService接口继承自Executor接口,它提供了更丰富的实现多线程的方法,比如,ExecutorService提供了关闭自己的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以调用ExecutorService的shutdown()方法来平滑地关闭 ExecutorService,调用该方法后,将导致ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。因此我们一般用该接口来实现和管理多线程。

        ExecutorService的生命周期包括三种状态:运行、关闭、终止。创建后便进入运行状态,当调用了shutdown()方法时,便进入关闭状态,此时意味着ExecutorService不再接受新的任务,但它还在执行已经提交了的任务,当素有已经提交了的任务执行完后,便到达终止状态。如果不调用shutdown()方法,ExecutorService会一直处在运行状态,不断接收新的任务,执行新的任务,服务器端一般不需要关闭它,保持一直运行即可。

        Executors提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。   

        public static ExecutorService newFixedThreadPool(int nThreads)

        创建固定数目线程的线程池。

        public static ExecutorService newCachedThreadPool()

        创建一个可缓存的线程池,调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线   程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

        public static ExecutorService newSingleThreadExecutor()

        创建一个单线程化的Executor。

        public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

        创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

        这四种方法都是用的Executors中的ThreadFactory建立的线程,下面就以上四个方法做个比较




    newCachedThreadPool()                                                                                                                                         

    -缓存型池子,先查看池中有没有以前建立的线程,如果有,就 reuse.如果没有,就建一个新的线程加入池中
    -缓存型池子通常用于执行一些生存期很短的异步型任务
     因此在一些面向连接的daemon型SERVER中用得不多。但对于生存期短的异步任务,它是Executor的首选。
    -能reuse的线程,必须是timeout IDLE内的池中线程,缺省     timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。
      注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。
     


    newFixedThreadPool(int)                                                      

    -newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程
    -其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待直到当前的线程中某个线程终止直接被移出池子
    -和cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP IDLE机制之类的),所以FixedThreadPool多数针对一些很稳定很固定的正规并发线程,多用于服务器
    -从方法的源代码看,cache池和fixed 池调用的是同一个底层 池,只不过参数不同:
    fixed池线程数固定,并且是0秒IDLE(无IDLE)    
    cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE  

     
    newScheduledThreadPool(int)
    -调度型线程池
    -这个池子里的线程可以按schedule依次delay执行,或周期执行
     
    SingleThreadExecutor()
    -单例线程,任意时间池中只能有一个线程
    -用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE(无IDLE)

     

        一般来说,CachedTheadPool在程序执行过程中通常会创建与所需数量相同的线程,然后在它回收旧线程时停止创建新线程,因此它是合理的Executor的首选,只有当这种方式会引发问题时(比如需要大量长时间面向连接的线程时),才需要考虑用FixedThreadPool。(该段话摘自《Thinking in Java》第四版)

                             

    Executor执行Runnable任务

        通过Executors的以上四个静态工厂方法获得 ExecutorService实例,而后调用该实例的execute(Runnable command)方法即可。一旦Runnable任务传递到execute()方法,该方法便会自动在一个线程上

    [java] view pl
     
    import java.util.concurrent.ExecutorService;   
    import java.util.concurrent.Executors;   
      
    public class TestCachedThreadPool{   
        public static void main(String[] args){   
            ExecutorService executorService = Executors.newCachedThreadPool();   
    //      ExecutorService executorService = Executors.newFixedThreadPool(5);  
    //      ExecutorService executorService = Executors.newSingleThreadExecutor();  
            for (int i = 0; i < 5; i++){   
                executorService.execute(new TestRunnable());   
                System.out.println("************* a" + i + " *************");   
            }   
            executorService.shutdown();   
        }   
    }   
      
    class TestRunnable implements Runnable{   
        public void run(){   
            System.out.println(Thread.currentThread().getName() + "线程被调用了。");   
        }   
    }  

       某次执行后的结果如下:

       从结果中可以看出,pool-1-thread-1和pool-1-thread-2均被调用了两次,这是随机的,execute会首先在线程池中选择一个已有空闲线程来执行任务,如果线程池中没有空闲线程,它便会创建一个新的线程来执行任务。

    Executor执行Callable任务

        在Java 5之后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,但是Runnable任务没有返回值,而Callable任务有返回值。并且Callable的call()方法只能通过ExecutorService的submit(Callable<T> task) 方法来执行,并且返回一个 <T>Future<T>,是表示任务等待完成的 Future。

        Callable接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常而Callable又返回结果,而且当获取返回结果时可能会抛出异常。Callable中的call()方法类似Runnable的run()方法,区别同样是有返回值,后者没有。

        当将一个Callable的对象传递给ExecutorService的submit方法,则该call方法自动在一个线程上执行,并且会返回执行结果Future对象。同样,将Runnable的对象传递给ExecutorService的submit方法,则该run方法自动在一个线程上执行,并且会返回执行结果Future对象,但是在该Future对象上调用get方法,将返回null。

        下面给出一个Executor执行Callable任务的示例代码:

    import java.util.ArrayList;   
    import java.util.List;   
    import java.util.concurrent.*;   
      
    public class CallableDemo{   
        public static void main(String[] args){   
            ExecutorService executorService = Executors.newCachedThreadPool();   
            List<Future<String>> resultList = new ArrayList<Future<String>>();   
      
            //创建10个任务并执行   
            for (int i = 0; i < 10; i++){   
                //使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中   
                Future<String> future = executorService.submit(new TaskWithResult(i));   
                //将任务执行结果存储到List中   
                resultList.add(future);   
            }   
      
            //遍历任务的结果   
            for (Future<String> fs : resultList){   
                    try{   
                        while(!fs.isDone);//Future返回如果没有完成,则一直循环等待,直到Future返回完成  
                        System.out.println(fs.get());     //打印各个线程(任务)执行的结果   
                    }catch(InterruptedException e){   
                        e.printStackTrace();   
                    }catch(ExecutionException e){   
                        e.printStackTrace();   
                    }finally{   
                        //启动一次顺序关闭,执行以前提交的任务,但不接受新任务  
                        executorService.shutdown();   
                    }   
            }   
        }   
    }   
      
      
    class TaskWithResult implements Callable<String>{   
        private int id;   
      
        public TaskWithResult(int id){   
            this.id = id;   
        }   
      
        /**  
         * 任务的具体过程,一旦任务传给ExecutorService的submit方法, 
         * 则该方法自动在一个线程上执行 
         */   
        public String call() throws Exception {  
            System.out.println("call()方法被自动调用!!!    " + Thread.currentThread().getName());   
            //该返回结果将被Future的get方法得到  
            return "call()方法被自动调用,任务返回的结果是:" + id + "    " + Thread.currentThread().getName();   
        }   
    }  

        某次执行结果如下:

       

        从结果中可以同样可以看出,submit也是首先选择空闲线程来执行任务,如果没有,才会创建新的线程来执行任务。另外,需要注意:如果Future的返回尚未完成,则get()方法会阻塞等待,直到Future完成返回,可以通过调用isDone()方法判断Future是否完成了返回。

    自定义线程池

        自定义线程池,可以用ThreadPoolExecutor类创建,它有多个构造方法来创建线程池,用该类很容易实现自定义的线程池,这里先贴上示例程序:

    import java.util.concurrent.ArrayBlockingQueue;   
    import java.util.concurrent.BlockingQueue;   
    import java.util.concurrent.ThreadPoolExecutor;   
    import java.util.concurrent.TimeUnit;   
      
    public class ThreadPoolTest{   
        public static void main(String[] args){   
            //创建等待队列   
            BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20);   
            //创建线程池,池中保存的线程数为3,允许的最大线程数为5  
            ThreadPoolExecutor pool = new ThreadPoolExecutor(3,5,50,TimeUnit.MILLISECONDS,bqueue);   
            //创建七个任务   
            Runnable t1 = new MyThread();   
            Runnable t2 = new MyThread();   
            Runnable t3 = new MyThread();   
            Runnable t4 = new MyThread();   
            Runnable t5 = new MyThread();   
            Runnable t6 = new MyThread();   
            Runnable t7 = new MyThread();   
            //每个任务会在一个线程上执行  
            pool.execute(t1);   
            pool.execute(t2);   
            pool.execute(t3);   
            pool.execute(t4);   
            pool.execute(t5);   
            pool.execute(t6);   
            pool.execute(t7);   
            //关闭线程池   
            pool.shutdown();   
        }   
    }   
      
    class MyThread implements Runnable{   
        @Override   
        public void run(){   
            System.out.println(Thread.currentThread().getName() + "正在执行。。。");   
            try{   
                Thread.sleep(100);   
            }catch(InterruptedException e){   
                e.printStackTrace();   
            }   
        }   
    }  

      运行结果如下:

        从结果中可以看出,七个任务是在线程池的三个线程上执行的。这里简要说明下用到的ThreadPoolExecuror类的构造方法中各个参数的含义。   

    public ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long         keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue)

    corePoolSize:线程池中所保存的线程数,包括空闲线程。

    maximumPoolSize:池中允许的最大线程数。

    keepAliveTime:当线程数大于核心数时,该参数为所有的任务终止前,多余的空闲线程等待新任务的最长时间。

    unit:等待时间的单位。

    workQueue:任务执行前保存任务的队列,仅保存由execute方法提交的Runnable任务。

    --------------------------------------四种创建线程方法对比--------------------------------------

    实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,因此可以把这两种方式归为一种这种方式与继承Thread类的方法之间的差别如下:

    1、线程只是实现Runnable或实现Callable接口,还可以继承其他类。

    2、这种方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。

    3、但是编程稍微复杂,如果需要访问当前线程,必须调用Thread.currentThread()方法。

    4、继承Thread类的线程类不能再继承其他父类(Java单继承决定)。

    5、前三种的线程如果创建关闭频繁会消耗系统资源影响性能,而使用线程池可以不用线程的时候放回线程池,用的时候再从线程池取,项目开发中主要使用线程池

    注:在前三种中一般推荐采用实现接口的方式来创建多线程

    创建线程本质只有1种,即创建Thread类,以上的所谓创建方式其实是实现run方法的方式:

    实现run方法的方式分为两类,你所看到的其他的都是对这两类的封装:

    1、实现runnable接口的run方法,并把runnable实例作为target对象,传给thread类,最终调用target.run

    2、继承Thread类,重写Thread的run方法,Thread.start会执行run方法

    展开全文
  • 通过实现Runnable接口创建线程

    千次阅读 2017-07-17 15:42:05
    实现runnable接口来创建线程类 创建Runnable实现类的对象 以Runnable实现类的对象作为thread的目标target来创建Thread对象 package newThread;public class Twothread implements Runnable { private int i; @...
    1. 实现runnable接口来创建线程类
    2. 创建Runnable实现类的对象
    3. 以Runnable实现类的对象作为thread的目标target来创建Thread对象
    package newThread;
    
    public class Twothread implements Runnable {
        private int i;
        @Override
        public void run() {
            //run方法同样是线程执行体
            for(;i<10;i++) {
                //此时获取线程名必须用Thread.currentThread().getName(),不能用this.getName()
                System.out.println(Thread.currentThread().getName()+" "+i);
            }
        }
        public static void main(String[] args) {
            for(int i=0;i<5;i++) {
                System.out.println(Thread.currentThread().getName()+""+i);
                if(i==1) {
                    Twothread th=new Twothread();//新建runnable对象
                    //通过new Thread(target,name)创建新线程
                    new Thread(th,"新线程1").start();//将runnable对象作为target实例化线程
                    new Thread(th,"新线程2").start();
                }
            }
        }
    
    }

    运行结果如图:这里写图片描述
    如图,线程1和线程2共享i变量,因为线程共用target对象。使用Thread实例化线程时,不同线程不能共用target的实例属性。对比“通过thread实例化线程理解”

    展开全文
  • 对于多线程,大家并不陌生,对于如何创建线程也是轻车熟路,对于使用new thread和实现runable接口的方式,不再多说。这篇博文我们介绍第三种:实现Callable接口。

    对于多线程,大家并不陌生,对于如何创建线程也是轻车熟路,对于使用new thread和实现runable接口的方式,不再多说。这篇博文我们介绍第三种:实现Callable接口。

    Callable接口

    接口定义:

    @FunctionalInterface
    public interface Callable<V> {
        V call() throws Exception;
    }
    

    从Callable的定义可以看出:

    1. Callable接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的,方法可以有返回值,并且可以抛出异常。但是Runnable不行。
    2. Callable需要依赖FutureTask,用于接收运算结果。一个产生结果,一个拿到结果。FutureTask是Future接口的实现类,也可以用作闭锁。

    简单实例

    计算0到100相加,返回结果。

    public class TestCallable {
    
    	public static void main(String[] args) {
    
    		CallableThreadDemo ctd = new CallableThreadDemo();
    		
    		//1.执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果
    		FutureTask<Integer> result = new FutureTask<Integer>(ctd);
    		
    		new Thread(result).start();
    		
    		//2.接收线程运算后的结果
    		try {
    			Integer sum = result.get(); //FutureTask 可用于闭锁
    			
    			System.out.println(sum);
    		} catch (InterruptedException | ExecutionException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    class CallableThreadDemo implements Callable<Integer>{
    
    	@Override
    	public Integer call() throws Exception {
    		int sum = 0;
    		
    		for (int i = 0; i <= 100; i++) {
    			sum += i;
    		}
    		return sum;
    	}
    }
    

    总结

    Callable接口其实特别简单,在多线程环境中,返回结果。

    下篇博文,我们研究如何解决多线程安全问题。

    展开全文
  • 实现Runnable接口创建线程

    千次阅读 2019-05-26 08:30:26
    实现Runnable接口来创建并启动线程的步骤如下: 1定义Runnable接口的实现类,重写该接口的run()方法,该run()方法的方法体是该线程线程执行体。 2创建Runnable实现类的实例,并以此实例作为Thread的target来创建...

    一 点睛

    实现Runnable接口来创建并启动线程的步骤如下:

    1 定义Runnable接口的实现类,重写该接口的run()方法,该run()方法的方法体是该线程的线程执行体。

    2 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

    3 调用线程对象的start()方法来启动该线程。

    二 代码

    // 通过实现Runnable接口来创建线程类
    public class SecondThread implements Runnable
    {
         private int i ;
         // run方法同样是线程执行体
         public void run()
         {
               for ( ; i < 100 ; i++ )
               {
                    // 当线程类实现Runnable接口时,
                    // 如果想获取当前线程,只能用Thread.currentThread()方法。
                    System.out.println(Thread.currentThread().getName()
                         + "  " + i);
               }
         }
         public static void main(String[] args)
         {
               for (int i = 0; i < 100;  i++)
               {
                    System.out.println(Thread.currentThread().getName()
                         + "  " + i);
                    if (i == 20)
                    {
                         SecondThread st = new SecondThread();      // ①
                         // 通过new Thread(target , name)方法创建新线程
                         new Thread(st , "新线程1").start();
                         new Thread(st , "新线程2").start();
                    }
               }
         }
    }

    三 运行

    ......
    main  17
    main  18
    main  19
    main  20
    main  21
    main  22
    main  23
    main  24
    main  25
    main  26
    新线程2  0
    main  27
    新线程1  0
    新线程1  2
    main  28
    新线程2  1
    main  29
    新线程1  3
    main  30
    新线程2  4
    main  31
    新线程1  5
    main  32
    ......

    四 说明

    1 创建的Runnable对象只能作为线程对象的target。

    2  从运行结果可以看出:两个子线程的i变量是连续的,也就是采用Runnable接口的方式创建的多个线程可以共享线程的target类的实例变量,因为这个target被多个线程共享,

    展开全文
  • 实现Runnable接口创建线程

    千次阅读 2018-12-01 18:16:48
    Java语言是一种单继承,多实现的面向对象的语言    自定义线程的的方式:  方式1:  1.... 2. 重写Thread类里边的run方法,把线程的功能代码放入到run... 创建自定义线程类对象  4. 开启线程,使用start方法  ...
  • 线程~~简单的线程创建,C语言实现

    千次阅读 2017-08-14 21:28:21
    原文地址:多线程~~简单的线程创建,C语言实现 - XD - CSDN博客  http://m.blog.csdn.net/qq_25425023/article/details/45251771 多线程~~简单的线程创建,C语言实现 发表于2015/4/24 21:30:58 11225人阅读...
  • 创建线程的四种方式

    千次阅读 多人点赞 2019-10-03 21:55:47
    创建线程的四种方式 继承Thread类 实现Runnable接口 使用Callable和Future创建线程 使用Executor框架创建线程池 继承Thread类 步骤 定义一个Thread类的子类,重写run方法,将相关逻辑实现,run()方法就是线程要...
  • java 创建线程的三种方式、创建线程池的四种方式

    万次阅读 多人点赞 2019-02-23 21:01:44
    java创建线程的三种方式: 继承Thread类创建线程实现Runnable接口 通过Callable和Future创建线程 java创建线程池的四种方式: newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理...
  • 创建实时线程的编程实现

    千次阅读 2020-12-22 14:37:08
    创建实时线程的编程实现 1.创建一个普通子线程 下面直接给出一个创建普通子线程的代码。 int running = 10*000*000; void son_thread(void *arg) { do{ //... }while(running); pthread_exit(NULL); } int ...
  • 创建线程有哪些方式?

    千次阅读 2019-05-13 16:23:36
    创建线程有哪些方式? 继承Thread类 实现Runnable接口 实现Callable接口,配合FutureTask 线程池 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util....
  • Java匿名内部类实现线程创建

    千次阅读 2019-05-06 14:47:12
    Java匿名内部类实现线程创建
  • Java 创建线程的三种方式总结

    万次阅读 2020-12-03 11:13:19
    Java 创建线程的三种方式总结 我们在开发中,为了提高程序的运行效率,经常会使用多线程的方式来实现并发操作。 那么创建线程有几种方式呢? 1、继承 Thread 类 直接继承 Thread 即可实现多线程。Thread 本质上也是...
  • 例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才...
  • 第一种方式:继承Thread类 步骤:1、定义类继承Thread 2、覆写Thread类的run方法。...该线程有两个作用:启动线程,调用run方法。 代码示例: class Test extends Thread { //private String name; Te...
  • 实现Callable接口,重写call()方法,通过FutureTask包装器来创建线程。 使用线程池创建线程。 其实方法1和方法2经常使用,方法3、4倒是我不怎么用。今天就研究一下方法3、4创建线程的方式。 实现Callable接口创建...
  • 详解 Java 创建线程的三种方式

    千次阅读 2021-01-18 16:02:50
    实现Runnable接口创建线程 使用Callable和Future创建线程 1. 通过继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 ...
  • 线程实现和使用场景

    万次阅读 2021-06-09 22:06:20
    多线程的实现和使用场景一、多线程实现方式1.1 Thread实现1.2 Runnable实现二、多线程的使用场景1.多线程使用场景1.1 多线程应该最多的场景:1.2多线程的常见应用场景:2.多线程小案列2.1 多线程计算2.2 多线程实现...
  • 通过实现Runnable接口来创建线程类 public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  Thread mThread = new ...
  • 创建线程的两种方式ThreadRunnable 一、简要说明 创建线程的两种方式,一是继承Thread类,二是实现Runnable接口,最后都是依据Thread类的构造方法实例化出一个线程对象,调用线程对象的start()方法,就可以通知...
  • 线程概述理解Windows内核对象线程是系统内核对象之一。在学习线程之前,应先了解一下内核对象。内核对象是系统内核分配的一个内存块,该内存块描述的是一个数据结构,其成员负责维护对象的各种信息。内核对象的数据...
  • Java创建线程及配合使用Lambda

    万次阅读 2018-08-30 16:32:13
    说明Java创建线程的三种方式,以及在创建线程的时候利用Lambda简化代码的实现
  • 使用线程池来创建线程

    万次阅读 多人点赞 2018-11-29 14:09:44
    1.如何使用线程池来创建线程? java中提供了一个静态工厂方法来创建不同的线程池: Executors 通过静态方法创建出的线程都实现了ExecutorService接口。常用的方法包括: newFixedThreadPool(int threads); ...
  • Java内存模型Java线程实现原理

    万次阅读 2016-07-15 23:52:18
    Java内存模型Java线程实现原理
  • 线程的介绍与创建

    千次阅读 多人点赞 2019-10-26 09:51:52
    这篇文章主要介绍了线程,并且介绍了它的三种创建方式(第四种使用线程池的方式在后面的博文有介绍),配有完整的代码实现
  • C++ 创建线程的方法

    千次阅读 2018-10-09 15:35:13
    c++开发过程中,创建线程是必不可少的,今天就给大家说说c++创建线程的方法,主要介绍我常用的2种方法。 第一种:CreateThread HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_...
  • java创建线程的四种方式

    万次阅读 2016-04-29 10:51:17
    java创建线程的三种方式 1. 继承Thread类创建线程类 2. 通过Runable接口创建线程类 3. 通过Callable和FutureTask创建线程  a. 创建Callable接口的实现类,并实现call()方法;  b. 创建Callable实现类的实例,...
  • Java实现Runnable接口创建线程

    千次阅读 2018-04-15 23:14:18
    Java实现Runnable接口创建多线程 ...比如,学生类Student继承了Person类,就无法通过继承Thread类,创建线程 针对这种情况,Thread类提供了另外一个构造方法Runnable target 其中,Runnable是一个...
  • 创建线程的三种方式优缺点

    万次阅读 多人点赞 2017-04-10 11:08:21
    Java使用Thread类代表线程,所有的线程对象...一、继承Thread类创建线程类 1.重写run方法。该run()方法的方法体就代表了线程需要完成的任务 2.创建Thread子类的实例 3.调用线程对象的start()方法来启动该线程。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,101,386
精华内容 440,554
关键字:

创建线程与实现线程