java多线程基础知识速通

news/2024/10/14 20:34:37

 1.线程和进程的区别

进程是正在运行的程序实例,每个进程包含了多个线程,每个现场执行不同的任务

进程都有自己的内存空间,而一个进程下的线程们则是共享内存空间

线程更加轻量,线程上下文切换的成本远低于进程上下文切换的成本

 

2.并行与并发的区别

并行是多核CPU一般执行相应个数的线程

并发是线程轮流使用一个或多个CPU,在单CPU的状态下,微观上讲其实他是串行的

 

3.创建线程都有哪些方式

extends Thread

public class MyThread extends Thread{......
}MyThread thread=new MyThread();

implement Runnable

pubic class MyRunnable implement Runnable{.......
}MyRunnable runnable=new MyRunnable();
Thread thread=new Thread(runnable);

implement Callable<T>

public class MyCallable implement Callable<T>{public T call(){....return T;}
}MyCallable callable=new MyCallable();
FutureTask<T> task=new FutureTask(callable);
Thread t=new Thread(task);
...
t.start();
...
//调用task的get方法可以获取执行结果
T res=task.get()

线程池创建线程

public class MyExecutors implements Runable{.......
}// 创建线程池对象
ExecutorService executorPool=Executors.newFiexedThreadPool(3);
threadPool.submit(new MyExecutors());// 关闭线程池
threadPool.shutdown

 

4.实现runnable和实现callable有什么区别?

  1. callable是有返回值的,可以用Future、FutureTask拿到执行的结果
  2. run()是不允许抛异常的,但是call()是可以抛的

 

5.线程执行的run()和start()方法有什么区别

run方法是直接执行了被封装的代码,是可以执行多次的

start方法是启动线程,该方法只能调用一次,多次会抛出异常。不过start方法也是调用run方法内的逻辑

 

6.线程包含了哪些状态

新建->运行->( 阻塞 等待 时间等待 )->终止

new一个线程之后是新建状态

调用start()方法后线程进入运行状态;在方法体内sync抢不到锁进入阻塞状态,获得锁后返回运行状态;有sleep()就是进入时间等待状态,;有wait()方法就是进入等待状态,notify()方法唤醒后进入运行状态

线程抢到了CPU执行权,start结束后就是终止状态

 

7.如何保证线程按顺序执行

线程具有join()方法,具体为等待某线程结束后,该线程才可以执行

Thread t1 = new Thread(() -> {System.out.println("t1 is run....");});Thread t2 = new Thread(() -> {try {t1.join();//直到t1运行结束之后t2才会运行System.out.println("t2 is run....");} catch (InterruptedException e) {throw new RuntimeException(e);}});t2.start();t1.start();

 

8.什么是notify和notifyAll

notify是随机唤醒一个wait线程;notifyAll是唤醒所有wait线程

 

9.说说wait和sleep的不同

wait(),wait(long)和sleep(long)都能让当前线程暂时放弃cpu的使用权,进入阻塞状态;

sleep是静态方法,可以直接用,wait方法是Object成员的方法,每个对象都有

wait()和wait(long)都可以被notify唤醒;sleep(long)、wait(long)都会在等待相应时间后被唤醒;都可以被打断唤醒

wait必须要配合锁来使用(比如sync锁)sleep无限制;wait执行后会释放CPU使用权,给其他线程使用sleep如果在sync锁内,即使sleep了CPU使用权也未释放

 

10.如何停止一个正在运行的线程

使用flag,让线程正常退出(在线程外指定位置终止while(xxx)条件)

使用interupt方法中断线程,打断sleep,wait,join的线程会抛异常;打断正常线程和第一种情况一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

程序员必看!从菜鸟到专家你要这么做,8年互联网老兵爆肝总结

“互联网行业工作8年多,在国内Top互联网大厂B(ytedance)AT中的两家待过。喜欢研究计算机基础原理,有移动端全栈(包括Android & iOS & 鸿蒙等)开发经验,对逆向和网络安全有一定经验。” 不管是在校大学生,还是初入职场的菜鸟,抑或是在互联网行业打拼多年的老码农…

CTF 的基础知识 题型 Trick总结

idk.references: 1 2 web php 语法基础 references: 1 php 脚本的基本格式: <?php //coding here ?>php 代码同样以 ; 结尾。 php 文件的后缀名大多是 php ,也有诸如 php5 php4 phps 之类,如果普通的后缀名被拦截不妨试试其他的。 php 变量用 $ 来定义,大小写敏感…

微服务03 微服务sentinel, springcloudgateway

6 Sentinel 6.1 Sentinel 介绍和工作机制 6.1.1 微服务流量治理组件介绍 随着微服务的流行,服务和服务之间的调用导致服务的稳定性问题变得越来越重要。 雪崩问题: 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,即雪崩。 解决雪崩问题的常见方式有…

Web刷题之polarctf靶场(3)

1. 干正则 打开靶场发现是简单的php代码审计, 先构造id=a[0]=www.polarctf.com, 由于要ping两次, 所以先构造cmd=|ls <?php error_reporting(0); if (empty($_GET[id])) {show_source(__FILE__);die(); } else {include flag.php;$a = "www.baidu.com";$result =…

题解:P2315 [HNOI2005] 数三角形

Problem Link [HNOI2005] 数三角形 题意 输入一个大三角形的各个边存在情况,输出里面有多少个正三角形。 Solution 简单暴力即可,用 \(4\) 个数组维护每条边能延伸的最大长度,然后逐个判断三角形是否可行即可。如图,l_upper 维护左端点向上(即 $\ell_{BA} $),l_lower 维…

梳理好本职工作之项目管理

项目整个里程碑,每个阶段应该输出什么

微服务01 ZooKeeper, Kafka

1.4 微服务 1.4.6 Spring Cloud JAVA 微服务技术 Dubbo是2014年之前阿里退出的分布式系统的技术(不属于微服务)。现在主流是 Spring Cloud Spring Cloud官网地址: https://spring.io/projects/spring-cloud 官网上实现方法有很多种,目前主流是阿里巴巴实现的方法Spring Boot…

Swarm 框架登场:OpenAI 第 3 阶段「敲门砖」;马斯克的 Teslabot 实际有人远程操控丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…