美文网首页
多线程基础--创建线程

多线程基础--创建线程

作者: collincp | 来源:发表于2018-09-12 00:19 被阅读0次
                                                                          启动多线程任务       
          创建线程有三种方式 一种为继承thread和实现Runnable或者Callable。但是在实际过程中创建线程都是去实现Runnable和Callable。两种分别对应执行任务不需要返回。后者会有返回值。所以看是否需要有返回来确定具体实现方式。
      场景一:图片上传功能,需要将数据上传并保持数据,同时需要对图片进行二次处理,比如将上传的图片切分成不同样式。但是最终切没有切。不需要管。就像A同时在做某事,做到一半了,又有一个人来帮忙做,A将一部分能分配的任务叫B来完成,但是B是否能不能完成,A不管。该模式就可通过实现runnable。有多少人帮助,就启动多少runnable。
    场景二:同为上述任务,但是图片处理需要将图片安装不同用户放到不同目录中,而A不确定图片在哪个目录,需要B将图片切完并告诉A图片的路径。这个时候就需要返回图片信息,就需要使用Callable。
    

    代码试下:要求jdk版本1.5以上。当前版本为jdk 1.8

    ------------------------------------------代码实现-------------------------------------------

    package TheradDemo;

    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;

    public class ThreadTest {

    public static void main(String[] args) {
        //继承 Thread
        ExtendsThread extendsThread = new ExtendsThread();//继承Thread
        extendsThread.start();//启动
    
        //实现Runnable
        RunnableThread runnableThread = new RunnableThread();//实现Runnable
        new Thread(runnableThread).start();//启动线程,可以看出创建Thread。Thread才能启动线程
    
        //实现 Callable 同时用FutureTask 获取返回结果 。需要返回结果两者必须同时使用
        CallableThread callableThread = new CallableThread();//实现Callable。new对象
        FutureTask<String> future = new FutureTask<String>(callableThread);//用来装返回结果。
        new Thread(future).start();//启动
        //获取返回值
        String reuslt = null;
        try {
            reuslt = future.get();//获取返回结果
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("result : " + reuslt);
        
        //将runnable任务执行10遍 。这个才是多线程的体现
        for(int i=0;i<10;i++) {
    

    // RunnableThread runnableThread = new RunnableThread();//可以看出直接写出现错误。
    //原因为需要创建不同线程,类似给10个不同的人来做,10个人的名字都不一样
    new Thread( new RunnableThread()).start();
    }
    }

    }
    class ExtendsThread extends Thread{
    public void run(){
    System.out.println("---第一种---- 继承Thread-----");
    }
    }

    class RunnableThread implements Runnable {
    @Override
    public void run() {
    System.out.println("---第二种---- 实现Runnable-----");
    }
    }

    class CallableThread implements Callable<String> {

    @Override
    public String call() throws Exception {
        String doTask = "---第三种---- 实现Callable----";
        return doTask;
    }
    

    }

    ------------------------------------------代码实现-------------------------------------------

    心得:多线程实现网上有很多,但是个人感觉,多线程,应该可以说成,启动 -->线程 -- >任务。启动都必须是thread(不使用线程池)。线程即为implements 而runnable和Callable里面的为任务。任务劲量简单。只是作为启动的任务的入口,具体需求使用具体的方法来解决。需要启动多少个,就new多少个thread来启动具体任务,比如最后在for中,就需要new多个thread,同时线程名称runnableThread 也需要不同。而runnableThread 里面的才是任务。以后再撸别人的代码,可以自行查看,那个是线程,那个是任务,又是在哪启动的。有时候在任务比较复杂,在创建线程的时候单独使用方法,线程在其他地方启动。所以我将多线程,分为启动、线程、任务。
    补充:直接使用threa启动线程非诚消耗资源,都是使用线程池管理。一个正常项目是不允许随意创建先的线程。
    线程池关系线程可以参考https://www.jianshu.com/p/1e772549d0d0

    相关文章

      网友评论

          本文标题:多线程基础--创建线程

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