标签: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进行调度,说的专业点就叫时间片。
标签:print pre row cut down 推荐 rri ide 分配
原文地址:https://www.cnblogs.com/chaunqi1995/p/10127130.html