广州网站建设360网站优化wordpress 韩国 主题公园

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

广州网站建设360网站优化,wordpress 韩国 主题公园,中视频自媒体平台注册官网,做网站后台系统的规范1、什么是线程 线程#xff08;Thread#xff09;是一条程序内部的一条执行流程。 程序中如果只有一条执行流程#xff0c;那这个程序就是单线程的程序。 2、什么是多线程 多线程#xff08;multithreading#xff09;#xff0c;是指从软件或者硬件上实现多个线程并发执…1、什么是线程 线程Thread是一条程序内部的一条执行流程。 程序中如果只有一条执行流程那这个程序就是单线程的程序。 2、什么是多线程 多线程multithreading是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中这些独立运行的程序片段叫作“线程”Thread利用它编程的概念就叫作“多线程处理“。 3、多线程的优缺点 3.1、优点 同时执行多个任务提高程序的工作效率。提高CPU的使用率。线程之间可以共享资源。相比进程而言创建线程代价比较小。 3.2、缺点 等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。对线程进行管理要求额外的 CPU开销线程的使用会给系统带来上下文切换的额外负担可能会出现线程的死锁。即对共享资源加锁实现同步的过程中可能会死锁。 4、java中的多线程 在java语言中 线程A和线程B堆内存和方法区内存共享。 但是栈内存独立一个线程一个栈。假设启动10个线程会有10个栈空间每个栈和每个栈之间互不干扰各自执行各自的这就是多线程并发。 5.、java多线程的声明周期 ​ 创建New线程对象通过 new 关键字创建但还未调用 start() 方法时线程处于新建状态。此时线程对象已经分配了内存空间但尚未启动执行。就绪Runnable线程对象调用 start() 方法后线程处于就绪状态。此时线程已经准备好执行但还没有获得 CPU 时间片。多个线程处于就绪状态时由 Java 虚拟机的线程调度器来决定哪个线程获得 CPU 时间片开始执行。运行Running当线程获得 CPU 时间片开始执行时线程处于运行状态。此时线程的 run() 方法正在被执行。阻塞Blocked在特定情况下线程可能会被暂时挂起进入阻塞状态。例如线程调用了 sleep() 方法、等待 I/O 操作、获得了某个对象的锁但没有获取到锁等。当阻塞状态的条件解除时线程会重新进入就绪状态等待获取 CPU 时间片继续执行。销毁Terminated线程执行完 run() 方法后或者调用了 stop() 方法线程将进入销毁状态。一旦线程进入了销毁状态就无法再恢复到其他状态。 6、Java中多线程的实现方式 6.1、继承Thread类 定义一个类继承Thread类重写run方法创建调用线程类的对象调用线程对象的start方法启动线程启动后会自动执行MyThread中重写的run()方法 /*** 1、类继承Thread类/ public class ThreadTest extends Thread{//必须重写Thread类中的run方法Overridepublic void run() {//super.run();for (int i 0; i 5; i) {System.out.println(子线程:i);}} }public class ThreadMain {public static void main(String[] args) {//2、创建子线程对象Thread t new ThreadTest();//3、启动子线程t.start();for (int i 0; i 5; i) {System.out.println(主线程:i);}} } PS 该方法编码简单但使用了继承不利于扩展。启动线程必须是用start方法不能用run方法否知会变成单线程。不要把主线程任务放到启动子线程之前否则会变成成主线程执行完了才执行子线程。 6.2、实现Runnable接口 定义一个线程任务类MyRunnable实现Runnable接口重写run方法创建MyRunnable对象把MyRunnable对象交给Thread处理   /* 1、实现Runnable接口/ public class RunnableTest implements Runnable{//重现run方法Overridepublic void run() {for (int i 0; i 5; i) {System.out.println(子线程:i);}} }public class RunnableMain {public static void main(String[] args) {/* 2.创建子线程对象/Runnable target new RunnableTest();/** 3.把Runnable对象交给Thread处理/Thread t new Thread(target);t.start();for (int i 0; i 5; i) {System.out.println(主线程执行输出 i);}} } PS实现接口可以继续继承或者实现接口扩展性强 匿名内部类推荐方法 public class RunnableMain1 {public static void main(String[] args) {//简化方式一Runnable r new Runnable() {Overridepublic void run() {for (int i 0; i 5; i) {System.out.println(子线程1:i);}}};new Thread®.start();//简化方式二new Thread(new Runnable() {Overridepublic void run() {for (int i 0; i 5; i) {System.out.println(子线程2:i);}}}).start();//简化方式三lambda表达式(jdk8以上)new Thread(() - {for (int i 0; i 5; i) {System.out.println(子线程3:i);}}).start();for (int i 0; i 5; i) {System.out.println(主线程执行输出 i);}} } 6.3、实现Callable接口通过FutureTask接口接收返回值JDK5新增 得到任务对象 第一步定义一个线程任务类MyCallable实现Callable接口重写call方法该方法可以返回结果 第二步用Future吧Callable对象封装成线程任务对象把线程任务对象交给Thread处理调用Thread的start方法启动任务线程执行完毕后通过FutureTask的get方法获得结果  /** 1、定义一个实现类实现Callable接口记得声明结果的数据类型/ public class CallableTest implements CallableString {//2.重写call方法private int n;public CallableTest(int n) {this.n n;}Overridepublic String call() throws Exception {int sum 0;for (int i 1; i n; i) {sum i;}return 子线程执行的结果是 sum;} }public class CalableMain {public static void main(String[] args) {//3.创建任务对象CallableString call1 new CallableTest(100);/* 4.把Callable任务对象交给FutureTask对象* FutureTask的作用1FutureTask实现了Runnable接口此时就可以交给Thread了* FutureTask的作用2可以在线程执行完毕后调用get方法得到线程执行的结果*///Thread t new Thread(call); 报错Thread不能接收call对象FutureTaskString f1 new FutureTask(call1);//5.交给线程处理Thread t1 new Thread(f1);//6.启动线程t1.start();CallableString call2 new CallableTest(200);FutureTaskString f2 new FutureTask(call2);Thread t2 new Thread(f2);t2.start();try {String rs1 f1.get(); //直接调用call方法可能还没有执行完使用get时若发现线程未执行完会先等线程执行完毕System.out.println(第一个结果为 rs1);} catch (Exception e) {e.printStackTrace();}try {String rs2 f2.get(); //直接调用call方法可能还没有执行完使用get时若发现线程未执行完会先等线程执行完毕System.out.println(第二个结果为 rs2);} catch (Exception e) {e.printStackTrace();}} }PS 扩展性强可以继续继承和实现。 可以在线程执行完毕后获取线程执行的结果。 6.4、Thread常用方法和构造器 Thread提供的常用方法说明public void run()线程的任务方法public void start()启动线程jublic String getName()获取当前线程的名称线程名称默认是Thread-索引public void setName(String name)为线程设置名称public static Thread currentThread()获取当前执行的线程对象public static void sleep(long time)让当前执行的线程休眠多少毫秒后再继续执行public final void join()…让调用当前这个放的线程先执行完Thread提供的常见构造器说明public Thread(String name)可以为当前线程指定名称public Thread(Runnable target)封装Runnable对象成为线程对象public Thread(Runnable target,String name)封装Runnable对象成为线程对象并指定线程名称