码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程总结

时间:2018-12-16 18:12:15      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:print   pre   row   cut   down   推荐   rri   ide   分配   

1.多线程开发又叫JUC开发(java.util.concurrent),至少5年以上才能涉及到,面试阿里常问

2.线程和进程有什么区别?

1)进程是资源(CUP,内存)分配的最小单位,线程是程序执行的最小单位。

2)一个程序至少有一个进程,一个进程至少有一个线程。

3.多线程的特点

三高:高并发,高可用,高性能。

4.线程核心概念

1)线程就是独立的执行路径。

2)在程序执行时,即使没有自己创建线程,后台也会存在多个线程,如GC线程,主线程。

3)main()称之为主线程,为系统的入口点,用于执行整个程序。

4)在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的。

5)对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制。

6)线程会带来额外的开销,如CUP调度时间,并发控制开销。

7)每个线程在自己的工作内存交互,加载和存储主内存控制不当会造成数据不一致。

5.Java中哪个方法必须在方法内部处理异常并且不能抛出?

多线程实现方法中,继承Thread的Run()方法是不能进行方法内部处理异常并且不能抛出的。

5.多线程的实现方式

1)继承Thread

public class MyThread extends Thread{
    
    @Override
    public void run() {
        for (int i = 1; i <= 50; i++) {
            System.out.println(Thread.currentThread().getName() + "---" + i);
        }
    }

}
public class Test {

    public static void main(String[] args) {
        MyThread m1 = new MyThread();
        MyThread m2 = new MyThread();
        m1.start();
        m2.start();
    }

}    

2)实现Runnable接口(推荐使用)

public class MyThread implements Runnable {
    
    @Override
    public void run() {
        for (int i = 1; i <= 50; i++) {
            System.out.println(Thread.currentThread().getName() + "---" + i);
        }
    }

}
public class Test {
public static void main(String[] args) { MyThread m = new MyThread(); Thread t1 = new Thread(m); Thread t2 = new Thread(m); t1.start(); t2.start(); }
}

3)实现Callable接口

<1>

/**
 * 实现Callable接口.相较于实现Runnable接口的方式,方法可以有返回值,并且可以抛出异常
 * 执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。  FutureTask 是  Future 接口的实现类
 * @author 奇
 *
 */
public class ThreadDemo implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 50; i++) {
            sum += i; 
        }
        return sum;
    }

}
public class TestCallable {
public static void main(String[] args) { ThreadDemo td = new ThreadDemo(); //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。 FutureTask<Integer> result = new FutureTask<Integer>(td); Thread t = new Thread(result); t.start(); //2.接收线程运算后的结果 try { //FutureTask 可用于 闭锁 类似于CountDownLatch的作用,在所有的线程没有执行完成之后这里是不会执行的 Integer sum = result.get(); System.out.println(sum); System.out.println("------------------------------------"); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }
}

<2>(面试中推荐说这个)

/**
 * 实现Callable接口,他有泛型
 * 实现Callable的call()方法
 * call()方法与run()方法的区别:有返回值,可以对异常类型进行抛出(throws)
 * run方法没有返回值,遇到异常必须try-catch处理
 * @author 奇
 *
 */
public class Test04 implements Callable<Integer> {
    
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 50; i++) {
            sum += i; 
        }
        return sum;
    }
    
    /**
     * 1.创建服务(线程池,里面放一个线程)
     * 2.提交线程
     * 3.获得结果对象
     * 4.通过结果对象的get方法来获得结果
     * 5.关闭服务
     * @param args
     * @throws InterruptedException
     * @throws ExecutionException
     */
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //与线程池有关
        Test04 t = new Test04();
        //创建一个线程池,也就是创建一个服务,线程池里面放了1个线程
        ExecutorService ser = Executors.newScheduledThreadPool(1);
        //提交执行
        //提交一个返回值的任务用于执行,返回一个表示任务的计算结果
        //Future表示异步计算结果,只能用get方法get()来拿到这个结果
        Future<Integer> res = ser.submit(t);
        //获得结果
        Integer r1 = res.get();
        System.out.println(r1);
        //关闭服务操作
        ser.shutdownNow();
    }

}

6.线程中常用的方法

1)获取线程名称:Thread.currentThread().getName();

2)设置线程名称:

<1>Thread.currentThread().setName("要设置的名字");

<2>实现Runnable()接口的时候new Thread(new StrartThread() , "要设置的名字").start();

7.使用start()方法会立即启动线程吗?

不会,他会通知CPU,CPU进行调度,说的专业点就叫时间片。

Java多线程总结

标签:print   pre   row   cut   down   推荐   rri   ide   分配   

原文地址:https://www.cnblogs.com/chaunqi1995/p/10127130.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!