资讯专栏INFORMATION COLUMN

初识JAVA多线程编程

luzhuqun / 1287人阅读

摘要:多线程术语辨析任务和线程是不同的中类本身不执行任何操作它只驱动赋予它的任务而才是定义任务的地方创建任务的方式有两种实现接口中的方法查看源码可以看到只有一个方法使用直接继承即可这样就创建了一个任务暗示调度器该线程可以让出资源了中实现方法部分源

java多线程 1. 术语辨析

任务和线程是不同的,Java中Thread类本身不执行任何操作,它只驱动赋予它的任务,而Runnable才是定义任务的地方.

2. 创建任务的方式有两种 2.1 实现Runnable接口中的run方法

1.查看Runnable源码,可以看到只有一个run()方法

   @FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface Runnable is used
     * to create a thread, starting the thread causes the object"s
     * run method to be called in that separately executing
     * thread.
     * 

* The general contract of the method run is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }

2.使用Runnable,直接继承即可,这样就创建了一个任务.

public class MyRunnable implements Runnable{

    @Override
    public void run() {
        int i=0;
        while(true)
            System.out.println(i++);
    }
    //暗示调度器该线程可以让出资源了
    Thread.yield();
}
2.2 Thread中实现run方法

1.Thread部分源码

/*
 * @see     Runnable
 * @see     Runtime#exit(int)
 * @see     #run()
 * @see     #stop()
 * @since   JDK1.0
 */
public class Thread implements Runnable {
    /* Make sure registerNatives is the first thing  does. */
    private static native void registerNatives();
    static {
        registerNatives();
    }

2.可以看到Thread继承了Runnable接口,所以Thread创建任务也是用的run方法
3.代码可以这样写

class MyThread extends Thread{
    @Override
    public void run() {
        int count=10;
        while(count--!=0)
            System.out.print(count+" ");
    }
}
3. 运行任务

1.不要误会,下面的方法并未启动一个线程,而是单纯的调用了实现Runnable接口的MyRunnable的run()方法,所以该任务的运行依旧被分派到该main线程中,不会独立运行在一个新线程里.

public class Main{
    public static void main(String[] args){
        Runnable runnable=new Runnable();
        runnable.run();
    }
}

2.调用Thread的start(),Thread中记录了很多线程信息,包括线程名称和优先级等,以MyRunnable的实例作参传入Thread,然后start即可运行.

public static void main(String[] args){

Thread thread=new Thread(new MyRunnable);
thread.start()
}

3.在调用start()后,子线程不会因为主线程代码执行结束而停止.

4. 使用执行器(Executor)管理Thread.
public static void main(String[] args){

    //常见执行器对象
    ExecutorService executorService= Executors.newCachedThreadPool();
    //向执行器中添加任务
    executorService.execute(new MyRunnable());
    //关闭向执行器中添加任务;
    executorService.shutdown();

创建执行器又三种类型可选,分别是newCachedThreadPool,newFixedThreadPool,newSingleThreadPool,区别如下

newCachedThreadPool:系统自动调配线程池中的线程数量,并主动复用已完成的线程资源.

newFixedThreadPool:可以自定义线程池中线程数量;

newSingleThreadPool:单例,线程池中只有一个线程,加载的任务会被排队,任务只能一个个依次完成.

5.线程的返回值

1.有些任务执行完后需要返回值,那么创建任务时可以通过实现Callale接口而实现该目的,Callable是一种具有类型参数的泛型,因为返回值是需要定义类型的.

class Task implements Callable{

    @Override
    public String call() throws Exception {
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        TimeUnit.MILLISECONDS.sleep(100);
        return "线程执行啦";
    }
}

2.然后在main()方法中接受返回值信息,对线程信息的管理可以用Future

public static void main(String[] args){
    ExecutorService executorService=Executors.newCachedThreadPool();
    Future future=executorService.submit(new Callable(){    
        @Override   
        public String call() throws Exception {
        return "执行啦";   
        }
    });
    //判断是否完成
    System.out.println(future.isDone());
    //任务完成后,才会打印词条语句,否则会阻塞.
    System.out.println(future.get());
    //判断是否完成
    System.out.println(future.isDone());
}
----------输出----------
false
执行啦
true

3.程序运行到get()方法时会阻塞,当运行完后,主程序才会继续向后执行.

6. 程序的优先级

1.优先级的设置在run方法中

public void run(){

    //例如将优先级设置为10
    Thread.currentThread().setPriority(10)
}

2.为了方便移植,建议将优先级设置为Thread中的三个常量.

7. 后台线程

1.设置后台线程语法 thread.setDaemon(true);要在start()之前.
2.后台线程创建的线程也为后台线程.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73495.html

相关文章

  • [初识C++] 何为最:心酸历史

    摘要:上面需要了解的是这俩个版本都是破蛹成蝶的版本世界挑战榜咋才前三还没挤进去呀,你想想世界上有几千中编程语言,在其中脱颖出来,可以说是天之娇子,凤毛麟角了。支持正版图灵上面买吧,如果没钱买盗版吧学完以后买本正版支持一下,创作不易是吧 ...

    forrest23 评论0 收藏0
  • 线程三分钟就可以入个门了!

    摘要:系统级线程核心级线程由操作系统内核进行管理。值得注意的是多线程的存在,不是提高程序的执行速度。实现多线程上面说了一大堆基础,理解完的话。虚拟机的启动是单线程的还是多线程的是多线程的。 前言 之前花了一个星期回顾了Java集合: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码剖析】 LinkedHashMa...

    awkj 评论0 收藏0
  • Java开发

    摘要:大多数待遇丰厚的开发职位都要求开发者精通多线程技术并且有丰富的程序开发调试优化经验,所以线程相关的问题在面试中经常会被提到。将对象编码为字节流称之为序列化,反之将字节流重建成对象称之为反序列化。 JVM 内存溢出实例 - 实战 JVM(二) 介绍 JVM 内存溢出产生情况分析 Java - 注解详解 详细介绍 Java 注解的使用,有利于学习编译时注解 Java 程序员快速上手 Kot...

    LuDongWei 评论0 收藏0

发表评论

0条评论

luzhuqun

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<