beizili

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

java多线程中常见问题小结:

1、java中实现多线程的几种方法:

  1. 继承Thread类;
  2. 实现Runnale接口;
  3. 实现Callable接口,通过FutureTask包装器来创建Thread;
  4. 使用线程池;
package com.test;

import java.util.concurrent.*;

public class ThreadTest4 implements Callable {
    @Override
    public Object call() throws Exception {
        System.out.println("test1");
        return "test";
    }
    public static void main(String[] args){
        ThreadTest4 threadTest4 = new ThreadTest4();
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        Future future=executorService.submit(threadTest4);
        try {
            System.out.println(future.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        executorService.shutdown();
    }
}

回显:
test1
test

2、如何停止一个线程?

  1. run方法正常退出;
  2. 使用stop强行终止;(已过期,不推荐)
  3. 使用inerrupt方法终止;

3、interrupted和isInterrupted方法的区别?

  1. Thread.interrupted是静态方法,会把中断状态清零。
  2. isInterrupted是非静态方法,只会查询中断状态,不会改变中断状态;
package com.test;

import java.net.HttpCookie;

public class ThreadTest5 implements Runnable{
    @Override
    public void run() {
        int i=0;
        while (true){
            if (Thread.currentThread().isInterrupted()){
                System.out.println("test1:"+Thread.currentThread().isInterrupted());
            }
            if (Thread.interrupted()){
                System.out.println("test2:"+Thread.currentThread().isInterrupted());
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(i++);
        }
    }

    public static void main(String[] args){
        ThreadTest5 t = new ThreadTest5();
        Thread thread = new Thread(t, "testInterrupt");
        thread.start();
        thread.interrupt();
    }
}

回显:
test1:true
test2:false
0
1
2

4、什么是线程安全?

线程安全就是说,多线程访问同一代码,不会产生不确定的结果。

5、java线程池中的submit()和execute()方法有什么区别

  1. execute是定义在Executor接口中,返回值是void.
  2. submit是定义在ExecutorService接口中,扩展了Executor接口,可以返回持有计算结果的Future.

6、常用线程池。

  1. newSingleThreadExecutor:创建一个单线程的线程池,此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
  2. newFixedThreadPool:创建一个固定大小的线程池,每次提交任务就创建一个线程,知道线程达到线程池的最大大小。
  3. newCachedThreadPool:创建一个可缓存的线程池,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统能够创建的最大县城大小。
  4. newScheduledThreadPool:创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求。
  5. newSingleThreadExecutor:创建一个大小乘的线程池。

更多内容请关注微信公众号“外里科技

官方公众号外里科技
运营公众号英雄赚
微信wxid_8awklmbh1fzm22
QQ1247408032
开源代码https://gitee.com/B_T/beimi

 

posted on 2020-04-12 19:14  被子里  阅读(6)  评论(0)    收藏  举报  来源