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

工作证明模板免费核心关键词如何优化

工作证明模板免费,核心关键词如何优化,做网站的收获,学网站建设学校多线程与高并发 线程的创建方式1.继承Thread类 重写run方法2.实现Runnable接口 重写run方法3. 实现Callable 重写call方法,配合FutureTask 线程的使用1.线程的状态1.1. 传统操作系统层面5种状态1.2.Java中给线程准备的6种状态 2.线程的常用方法2.1 获取当前线程2.2 …

多线程与高并发

  • 线程的创建方式
    • 1.继承Thread类 重写run方法
    • 2.实现Runnable接口 重写run方法
    • 3. 实现Callable 重写call方法,配合FutureTask
  • 线程的使用
    • 1.线程的状态
      • 1.1. 传统操作系统层面5种状态
      • 1.2.Java中给线程准备的6种状态
    • 2.线程的常用方法
      • 2.1 获取当前线程
      • 2.2 线程的名字
      • 2.3 线程的优先级
      • 2.4 线程的让步
      • 2.5 线程的休眠
      • 2.6 线程的强占
      • 2.7 守护线程

线程的创建方式

1.继承Thread类 重写run方法

public class MiTest {public static void main(String[] args) {MyJob t1 = new MyJob();t1.start();for (int i = 0; i < 100; i++) {System.out.println("main:" + i);}}}
class MyJob extends Thread{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("MyJob:" + i);}}
}

2.实现Runnable接口 重写run方法

public class MiTest {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread t1 = new Thread(myRunnable);t1.start();for (int i = 0; i < 1000; i++) {System.out.println("main:" + i);}}}class MyRunnable implements Runnable{@Overridepublic void run() {for (int i = 0; i < 1000; i++) {System.out.println("MyRunnable:" + i);}}
}

lambda方式

Thread t2 = new Thread(() -> {for (int i = 0; i < 100; i++) {System.out.println("lambda:" + i);}
});

3. 实现Callable 重写call方法,配合FutureTask

public class MiTest {public static void main(String[] args) throws ExecutionException, InterruptedException {//1. 创建MyCallableMyCallable myCallable = new MyCallable();//2. 创建FutureTask,传入CallableFutureTask futureTask = new FutureTask(myCallable);//3. 创建Thread线程Thread t1 = new Thread(futureTask);//4. 启动线程t1.start();//5. 做一些操作//6. 要结果Object count = futureTask.get();System.out.println("总和为:" + count);}
}class MyCallable implements Callable{@Overridepublic Object call() throws Exception {int count = 0;for (int i = 0; i < 100; i++) {count += i;}return count;}
}

线程的使用

1.线程的状态

1.1. 传统操作系统层面5种状态

在这里插入图片描述

1.2.Java中给线程准备的6种状态

在这里插入图片描述
NEW:Thread对象被创建出来了,但是还没有执行start方法。

RUNNABLE:Thread对象调用了start方法,就为RUNNABLE状态(CPU调度/没有调度)

BLOCKED、WAITING、TIME_WAITING:都可以理解为是阻塞、等待状态,因为处在这三种状态下,CPU不会调度当前线程

BLOCKED:synchronized没有拿到同步锁,被阻塞的情况

WAITING:调用wait方法就会处于WAITING状态,需要被手动唤醒

TIME_WAITING:调用sleep方法或者join方法,会被自动唤醒,无需手动唤醒

TERMINATED:run方法执行完毕,线程生命周期到头了

2.线程的常用方法

2.1 获取当前线程

public static void main(String[] args) throws ExecutionException, InterruptedException {// 获取当前线程的方法Thread main = Thread.currentThread();System.out.println(main);// "Thread[" + getName() + "," + getPriority() + "," +  group.getName() + "]";// Thread[main,5,main]
}

2.2 线程的名字

public static void main(String[] args) throws ExecutionException, InterruptedException {Thread t1 = new Thread(() -> {System.out.println(Thread.currentThread().getName());});t1.setName("模块-功能-计数器");t1.start();
}

2.3 线程的优先级

其实就是CPU调度线程的优先级、
java中给线程设置的优先级别有10个级别,从1~10任取一个整数。
如果超出这个范围,会排除参数异常的错误

public static void main(String[] args) throws ExecutionException, InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {System.out.println("t1:" + i);}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {System.out.println("t2:" + i);}});t1.setPriority(1);t2.setPriority(10);t2.start();t1.start();
}

2.4 线程的让步

可以通过Thread的静态方法yield,让当前线程从运行状态转变为就绪状态。

public static void main(String[] args) throws ExecutionException, InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 100; i++) {if(i == 50){Thread.yield();}System.out.println("t1:" + i);}});Thread t2 = new Thread(() -> {for (int i = 0; i < 100; i++) {System.out.println("t2:" + i);}});t2.start();t1.start();
}

2.5 线程的休眠

Thread的静态方法,让线程从运行状态转变为等待状态

sleep有两个方法重载:

  • 第一个就是native修饰的,让线程转为等待状态的效果
  • 第二个是可以传入毫秒和一个纳秒的方法(如果纳秒值大于等于0.5毫秒,就给休眠的毫秒值+1。如果传入的毫秒值是0,纳秒值不为0,就休眠1毫秒)

sleep会抛出一个InterruptedException

public static void main(String[] args) throws InterruptedException {System.out.println(System.currentTimeMillis());Thread.sleep(1000);System.out.println(System.currentTimeMillis());
}

2.6 线程的强占

Thread的非静态方法join方法

需要在某一个线程下去调用这个方法

如果在main线程中调用了t1.join(),那么main线程会进入到等待状态,需要等待t1线程全部执行完毕,在恢复到就绪状态等待CPU调度。

如果在main线程中调用了t1.join(2000),那么main线程会进入到等待状态,需要等待t1执行2s后,在恢复到就绪状态等待CPU调度。如果在等待期间,t1已经结束了,那么main线程自动变为就绪状态等待CPU调度。

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 10; i++) {System.out.println("t1:" + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();for (int i = 0; i < 10; i++) {System.out.println("main:" + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (i == 1){try {t1.join(2000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

2.7 守护线程

默认情况下,线程都是非守护线程

JVM会在程序中没有非守护线程时,结束掉当前JVM

主线程默认是非守护线程,如果主线程执行结束,需要查看当前JVM内是否还有非守护线程,如果没有JVM直接停止

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 10; i++) {System.out.println("t1:" + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t1.setDaemon(true);t1.start();
}
http://www.yayakq.cn/news/52421/

相关文章:

  • seo sem 做网站网页设计与制作简答题答案
  • 西塞山区建设局网站长沙外贸建站
  • 网站开发人员叫什么制作网站先做前端还是后端
  • 宜宾网站设计北京神州网站建设
  • wap网站建设方案 pdf软文营销的步骤
  • 网站导航条背景图片镇江优化九一
  • 室内设计知名网站临沂做网站选盛誉
  • 专业房产网站建设公司排名驻马店seo
  • wordpress前台版权北京优化社区防控措施方案
  • 论坛类网站备案dede 网站地图 调用文章
  • 郑州seo网站排名优化公司建设音乐网站
  • 网站首页可以做竖版吗做一个网站多久
  • 福建交通建设网站广州有哪些网络设计公司
  • 怎么看网站有没有做百度推广如何用jeecg建设网站
  • 泰安网站优化赣州网站建设费用
  • 在网站后台做网页河北廊坊建设银行网站
  • 网站联动网页版微信二维码扫描
  • 个人创业做网站做名片素材网站
  • 做远程培训网站用什么系统在线图片编辑器马赛克
  • 企业网站的推广方式自助建站和wordpress
  • 信阳网站建设汉狮报价做网站平台的公司
  • 企业网站的建设意义软件外包公司值得去吗
  • 网站建设人力调配范文廊坊网站建设价格
  • 不会技术怎么做公司网站药品招商网站大全
  • 任丘市做网站鹤岗做网站公司
  • ip做网站域名黄骅港股票代码
  • 青岛建站方案wordpress博客平台推荐
  • python3 网站开发沧州最火网站
  • 湘潭网站建设 x磐石网络自适应导航网站模板
  • 淘宝网站建设概要网站空间到期怎么办