当前位置: 首页 > news >正文

有没有做书签的网站自己做的网站怎么被搜录

有没有做书签的网站,自己做的网站怎么被搜录,wordpress集成api,宜昌当阳网站开发目录 多线程基础 1.线程和进程 线程是什么#xff1f; 为啥要有线程#xff1f; 进程和线程的区别#xff1f; Java 的线程 和 操作系统线程 的关系 使用jconsole观察线程 2.创建线程的多种方式 3.Thread类及其常见方法 Thread类的常见构造方法 Thread类的常见属性…目录 多线程基础 1.线程和进程 线程是什么 为啥要有线程 进程和线程的区别 Java 的线程 和 操作系统线程 的关系 使用jconsole观察线程 2.创建线程的多种方式 3.Thread类及其常见方法 Thread类的常见构造方法 Thread类的常见属性 Thread类的常见方法 4.线程的各种状态 5.使用多线程的风险线程安全问题 多线程基础 并发编程是目前很多大公司面试考核的重点内容为什么并发编程那么重要呢这还要从CPU的发展讲起考量一块CPU性能高不高的重要一个因素就是CPU的计算能力起初为了提升CPU的计算能力硬件厂家们尽可能的缩小其内部每个计算单元所占的体积保证每块CPU上尽可能的装有更多的计算单元但受限于工艺水平硬件厂家们发现当一块CPU内计算单元的数目越多时它成为残次品的概率也会提高相应成本也会提高为了解决这一问题硬件厂家们发明了现在常见的多核CPU及一个CPU上存在多个核心。为了充分利用多核技术逐渐发展起来了多进程和多线程。下面就让我来带大家深入理解多线程的奥秘吧。 1.线程和进程 线程是什么 一个线程就是一个 执行流 . 每个线程之间都可以按照顺讯执行自己的代码 . 多个线程之间 同时 执行着多份代码. 为啥要有线程 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU资源. 有些任务场景需要 等待 IO, 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程. 进程和线程的区别 进程是包含线程的. 每个进程至少有一个线程存在即主线程。 进程和进程之间不共享内存空间. 同一个进程的线程之间共享同一个内存空间. 进程是系统分配资源的最小单位线程是系统调度的最小单位。 虽然多进程也能实现 并发编程 , 但是线程比进程更轻量 . 创建线程比创建进程更快. 销毁线程比销毁进程更快. 调度线程比调度进程更快. 最后 , 线程虽然比进程轻量 , 但是人们还不满足 , 于是又有了 线程池 (ThreadPool) 和 协程 (Coroutine) Java 的线程 和 操作系统线程 的关系 线程是操作系统中的概念 . 操作系统内核实现了线程这样的机制 , 并且对用户层提供了一些 API 供用户使用( 例如 Linux 的 pthread 库 ). Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装 使用jconsole观察线程 在jdk的bin文件夹下Java为我们提供了一个工具jconsole.exe启动这个工具我们便可以清晰的观察自己电脑内Java线程的启动和销毁了。 2.创建线程的多种方式 方法一继承Thread来创建一个线程类。 //创建一个线程类 class MyThread extends Thread {Overridepublic void run() {System.out.println(这里是线程运行的代码);} } MyThread t new MyThread();//创建 MyThread 类的实例 t.start(); // 线程开始运行 方法二 实现Runnable接口 class MyRunnable implements Runnable {Overridepublic void run() {System.out.println(这里是线程运行的代码);} } //创建 Thread 类实例, 调用 Thread 的构造方法时将 Runnable 对象作为 target 参数. Thread t new Thread(new MyRunnable()); t.start(); // 线程开始运行 方法三使用ExecutorService、Callable、Future实现有返回结果的多线程 import java.util.concurrent.*; import java.util.Date; import java.util.List; import java.util.ArrayList;/** * 有返回值的线程 */ SuppressWarnings(unchecked) public class Test { public static void main(String[] args) throws ExecutionException,InterruptedException {System.out.println(----程序开始运行----);Date date1 new Date();int taskSize 5;// 创建一个线程池ExecutorService pool Executors.newFixedThreadPool(taskSize);// 创建多个有返回值的任务ListFuture list new ArrayListFuture();for (int i 0; i taskSize; i) {Callable c new MyCallable(i );// 执行任务并获取Future对象Future f pool.submit(c);// System.out.println( f.get().toString());list.add(f);}// 关闭线程池pool.shutdown();// 获取所有并发任务的运行结果for (Future f : list) {// 从Future对象上获取任务的返回值并输出到控制台System.out.println( f.get().toString());}Date date2 new Date();System.out.println(----程序结束运行----程序运行时间【 (date2.getTime() - date1.getTime()) 毫秒】); } }class MyCallable implements CallableObject { private String taskNum;MyCallable(String taskNum) {this.taskNum taskNum; }public Object call() throws Exception {System.out.println( taskNum 任务启动);Date dateTmp1 new Date();Thread.sleep(1000);Date dateTmp2 new Date();long time dateTmp2.getTime() - dateTmp1.getTime();System.out.println( taskNum 任务终止);return taskNum 任务返回运行结果,当前任务时间【 time 毫秒】; } } tips 上述的方法一方法二均可以通过匿名内部类的方式创建线程还可用lambda表达式来简化 // 使用匿名类创建 Thread 子类对象 Thread t1 new Thread() {Overridepublic void run() {System.out.println(使用匿名类创建 Thread 子类对象);} }; // 使用匿名类创建 Runnable 子类对象 Thread t2 new Thread(new Runnable() {Overridepublic void run() {System.out.println(使用匿名类创建 Runnable 子类对象);} }); // 使用 lambda 表达式创建 Runnable 子类对象 Thread t3 new Thread(() - System.out.println(使用匿名类创建 Thread 子类对象)); Thread t4 new Thread(() - {System.out.println(使用匿名类创建 Thread 子类对象); }); 3.Thread类及其常见方法 Thread 类是 JVM 用来管理线程的一个类换句话说每个线程都有一个唯一的 Thread 对象与之关联。 Thread 类的对象 就是用来描述一个线程执行流的 JVM 会将这些 Thread 对象组织起来用于线程调度线程管理。 Thread类的常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象并命名Thread(Runnable target, String name)使用 Runnable 对象创建线程对象并命名 【了解】 Thread(ThreadGroup group, Runnable target) 线程可以被用来分组管理分好的组即为线程组这个目前我们了解即可 Thread t1 new Thread(); Thread t2 new Thread(new MyRunnable()); Thread t3 new Thread(这是我的名字); Thread t4 new Thread(new MyRunnable(), 这是我的名字); Thread类的常见属性 属性 获取方法 ID getId() 名称 getName() 状态 getState() 优先级 getPriority() 是否后台线程 isDaemon() 是否存活 isAlive() 是否被中断 isInterrupted() ID 是线程的唯一标识不同线程不会重复 名称是各种调试工具用到 状态表示线程当前所处的一个情况下面我们会进一步说明 优先级高的线程理论上来说更容易被调度到 关于后台线程需要记住一点JVM会在一个进程的所有非后台线程结束后才会结束运行。 是否存活即简单的理解为 run 方法是否运行结束了 线程的中断问题下面我们进一步说明 Thread类的常见方法 1.线程启动start()方法 前面我们知道覆写run方法来创建一个线程对象但run方法只是为了给线程启动提供一个要做的事情清单不能通过调用run方法来使线程启动。 调用start方法可以真正在操作系统的底层创建一个线程。 2.线程中断interrupt()方法  interrupt()、interrupted() 和 isInterrupted() 方法是 Java 中用于线程中断的相关方法它们有着不同的功能和用法。下面我将逐一解释它们的区别。 我们把run方法运行结束叫做线程的中断通常情况下我们为了保证线程的存在会在run方法内部自定义设置一个循环条件等于true让循环能一直存在我们把这个条件叫做标记值当标记值被改为false时循环结束run方法也会执行完毕。当run方法内的代码运行完毕之后内核中的线程就会被摧毁称为线程中断。除了自定义标记值之外Thread内部还提供了一个boolean类型的变量可以作为标记值(isInterrupted), 清除中断标志将 isInterrupted 的值设置为 false设置中断标志将 isInterrupted 的值 设置为 true 3.2.1 interrupt() 当调用线程的 interrupt() 方法时如果线程处于阻塞状态就会抛出 InterruptedException 异常并清除中断标志接着结束睡眠。 如果线程未处于阻塞状态仅仅是设置中断标志并不是真正的中断线程。线程的中断由线程决定线程可以通过检查中断标志来决定是否中断自己的执行。 public class MyThread extends Thread {Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {// 线程任务逻辑// ...}} }public static void main(String[] args) {MyThread thread new MyThread();thread.start();// 等待一段时间后中断线程try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt(); }3.2.2 interrupted() interrupted() 方法是一个静态方法用于判断当前线程是否被中断并返回中断状态而且在判断中断状态后还会自动清除中断标志。 如果线程没有被中断则返回 false如果线程被中断则返回 true public class ThreadDemo {private static class MyRunnable implements Runnable {Overridepublic void run() {for (int i 0; i 10; i) {System.out.println(Thread.interrupted());}}}public static void main(String[] args) throws InterruptedException {MyRunnable target new MyRunnable();Thread thread new Thread(target, 李四);thread.start();thread.interrupt();} }3.2.3 isInterrupted() isInterrupted() 用于检查当前线程是否被中断并且不会清除线程的中断状态。 当线程被中断时返回 true。当线程没有被中断时返回 false。 public class ThreadDemo {private static class MyRunnable implements Runnable {Overridepublic void run() {for (int i 0; i 10; i) {System.out.println(Thread.currentThread().isInterrupted());}}}public static void main(String[] args) throws InterruptedException {MyRunnable target new MyRunnable();Thread thread new Thread(target, 李四);thread.start();thread.interrupt();} }3.线程等待join()方法 java中线程是并发执行的线程的调度是抢占式的所以操作系统对于线程调用的顺序的不知道的我们无法判断哪个线程先结束为了能够控制线程的结束顺序因此 java 提供了 join方法。join方法内可以添加long类型参数译为等待线程结束最多等多少毫秒。 在 Java 中join() 方法是 Thread 类的一个方法它允许一个线程等待另一个线程执行完毕再执行接下来的步骤。当一个线程调用另一个线程的 join() 方法时调用线程将被阻塞。 public class JoinExample {public static void main(String[] args) throws InterruptedException {Thread thread new Thread(() - {try {// 模拟线程执行耗时的操作Thread.sleep(2000);System.out.println(子线程执行完毕);} catch (InterruptedException e) {e.printStackTrace();}});thread.start(); // 启动子线程thread.join(); // 主线程等待子线程执行完毕System.out.println(主线程继续执行);} } 4.获取线程引用currentThread()方法 public static Thread currentThread();返回当前线程对象的引用 public class ThreadDemo {public static void main(String[] args) {Thread thread Thread.currentThread();System.out.println(thread.getName());} }5.线程休眠sleep()方法 让线程休眠一段时间不去参与CPU的竞争与阻塞状态不同需要注意的是因为线程的调度室不可控的所以这个方法只能保证实际休眠时间参数的设置的休眠时间。 public class ThreadDemo {public static void main(String[] args) throws InterruptedException {System.out.println(System.currentTimeMillis());Thread.sleep(3 * 1000);System.out.println(System.currentTimeMillis());} }4.线程的各种状态 线程的状态是一个枚举类型 Thread.State我们可以通过这段代码得到线程的状态 public class ThreadState {public static void main(String[] args) {for (Thread.State state : Thread.State.values()) {System.out.println(state);}} }Java中线程的状态主要有以下几种 1新建状态NEW    Thread对象创建了。但是还没有调用start操作系统内核中的线程还没创建 2终止状态TERMINATED    run方法执行完毕内核中的线程已经销毁 3可运行状态RUNNABLE    线程就绪正在cpu上执行 4超时等待状态TIMED_WAITING    由sleep等带有有时间的方法进入的阻塞 5等待状态WAITING    不带时间的阻塞线程在等待其他线程的特定操作如wait / join 6阻塞状态BLOCKED    由于锁竞争产生的阻塞 5.使用多线程的风险线程安全问题 虽然我们现在使用的CPU拥有多个核心在正常使用计算机时一个核心上仍然会同时运行多个线程怎样保持多个线程同时运行呢其实是通过高频切换来完成的即一个线程在CPU上运行一会再切换为另一个线程运行因为中间切换的时间很短且CPU执行速率非常快在宏观层面我们就认为是多个线程在同时运行。如果同时运行的这几个线程在操作同一件事且这件事不具有原子性就很容易发生线程安全问题。 什么是原子性 我们把一段代码想象成一个房间每个线程就是要进入这个房间的人。如果没有任何机制保证 A 进入房间之后还没有出来B 是不是也可以进入房间打断 A 在房间里的隐私。这个就是不具备原子性的。 那我们应该如何解决这个问题呢是不是只要给房间加一把锁 A 进去就把门锁上其他人是不是就进不来了。这样就保证了这段代码的原子性了。 有时也把这个现象叫做同步互斥表示操作是互相排斥的。 一条 java 语句不一定是原子的也不一定只是一条指令 比如我们之前常看到的 n 其实是由三步操作组成的 1. 从内存把数据读到 CPU 2. 进行数据更新 3. 把数据写回到 内存 当两个线程同时执行n操作时有可能其中一个线程刚执行完第一步CPU就切换线程了此时第二个线程执行n的操作执行完毕重新写回内存这时CPU重新切回第一个线程第二个线程继续之前的执行第二步操作因为两个线程都是在同一个n的基础上进行了1操作最后写会内存中的n只加了一次1但我们执行了两次n内存中的正确结果应该是n要加两次1就会出现bug想像一下如果这种情况出现在银行存钱的时候你和你家人同存钱却只显示存进去了一份这会是一件多么严重的bug为了解决这一问题Java也给我们提供了很多方法我会在下篇文章详细介绍如何避免发生线程安全问题。 ❤️ 我是小皮侠谢谢大家都能看到这里 主页已更新Java基础内容数据结构基础数据库算法 未来会更新Java项目SpringBootRedis以及各种Java路线会用到的技术。 求点赞求收藏求评论求关注 ‍♀️谢谢大家 我的博客即将同步至腾讯云开发者社区邀请大家一同入驻https://cloud.tencent.com/developer/support-plan?invite_code2upjellgk3eow
http://www.hkea.cn/news/14410535/

相关文章:

  • 为什么要选择高端网站定制十大免费的免费软件下载官网
  • 网站开发毕设开题报告青岛公交优化
  • 建站之星用做什么网站站牛网是做什么的
  • 网站建设的工资网络促销方案
  • 怎么查看网站访问速度效果图网站名字
  • 布吉网站开发网站建设费用 开办费
  • 康巴什网站建设做暧暧视频免费视频中国网站
  • 做电影网站不放国内主机wordpress幻灯箱插件
  • 网站的费用可以做无形资产扬州网站建设公司
  • 个人做外贸的网站有哪些帮您做网站
  • php怎么创建网站网站免费模块
  • 2013网站挂马教程专业苏州网站建设公司
  • 长沙销售公司 网站电商app制作平台
  • 一起装修网官方网站网站收费系统平台
  • 如何做一个好网站seo线下培训课程
  • 如何做网站轮播图和菜单全屏xmlrpc.php wordpress
  • 手机网站制作代码焦作电子商务网站建设案例
  • 中国建设银行 英文网站建筑公司企业理念
  • 秦皇岛市教育考试院网站网络营销推广计划
  • 佛山网站建设科技公司wordpress修改文章固定id
  • 福州制作公司网站青岛模板网站
  • 千灯网站建设wordpress获取菜单链接
  • 网站后台无法访问网站开发辅助工具
  • 智能科技网站模板下载地址网站后台申请邮箱
  • 临漳手机网站建设wordpress 动态js
  • 有哪些网站是可以接单做任务的做音乐网站的栏目
  • 网站的结构与布局优化wordpress目录 读写权限设置
  • 怎么做网站美工在家跟狗做网站视频
  • SEO案例网站建设价格口碑营销是指
  • 某财政局网站建设方案德州网络推广培训