海口cms建站系统,室内设计师联盟网,宁波市余姚建设局网站,设计logo网站免目录 1.认识多线程
1.1线程的概念
1.2进程和线程
1.2.1进程和线程用图描述关系 1.2.2进程和线程的区别
1.3Java 的线程和操作系统线程的关系 2.创建线程
2.1继承 Thread 类 2.2实现 Runnable 接口 2.3匿名内部类创建 Thread 子类对象
2.4匿名内部类创建 Runnable 子类对…目录 1.认识多线程
1.1线程的概念
1.2进程和线程
1.2.1进程和线程用图描述关系 1.2.2进程和线程的区别
1.3Java 的线程和操作系统线程的关系 2.创建线程
2.1继承 Thread 类 2.2实现 Runnable 接口 2.3匿名内部类创建 Thread 子类对象
2.4匿名内部类创建 Runnable 子类对象
2.5lambda 表达式创建 Runnable 子类对象 1.认识多线程
1.1线程的概念
引入线程进程虽然可以很好的实现并发编程但在进行频繁的进程创建和销毁的过程中开销比较大体现在资源的申请和释放上。所以就发明了比进程更轻量的线程。
线程与进程相比 1创建线程比创建进程更快 . 2销毁线程比销毁进程更快 . 3调度线程比调度进程更快 . 线程具体是什么 一个线程就是一个 执行流 . 每个线程之间都可以按照顺讯执行自己的代码 . 多个线程之间 同时 执行 着多份代码. 1.2进程和线程 1.2.1进程和线程用图描述关系 1.进程是包含线程的 . 每个进程至少有一个线程存在即主线程。 2.进程和进程之间不共享内存空间 . 同一个进程的线程之间共享同一个内存空间 . 1.2.2进程和线程的区别
高频面试题
1.进程是包含线程的。
2.每个线程就是一个 独立的执行流可以单独执行一些代码并参与到CPU的调度中状态上下文优先级记账信息每个线程都有自己的一份。
3.每个进程都有自己的资源进程中的线程共用一份资源内存空间和文件描述符表。 2与3说明 进程是系统分配资源的最小单位线程是系统调度的最小单位。 4.进程与进程之间不会相会影响但 线程与线程之间会相会影响。如果一个进程中的某个线程抛出异常可能会导致进程中的所有线程都异常终止。 1.3Java 的线程和操作系统线程的关系 1.线程是操作系统中的概念 . 操作系统内核实现了线程这样的机制 , 并且对用户层提供了一些 API 供用户使用(例如 Linux 的 pthread 库 ). 2. Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装 . 注意 1线程与线程之间可能会相互干扰产生逻辑bug引起线程安全。 2线程不是越多越好线程太多调度开销可能会非常明显。 2.创建线程
2.1继承 Thread 类
1继承 Thread 来创建一个线程类 class MyThread extends Thread { Override public void run() { System.out.println(这里是线程运行的代码); } } 此处 run()不需要手动调动在线程创建好之后JVM会自动调用执行回调函数。
2创建 MyThread 类的实例 MyThread t new MyThread(); 创建出的实例才是真线程。 (3)调用 start 方法启动线程 t.start(); // 线程开始运行 此时才会真正调用系统API在系统内核中创建出线程执行run())。 为啥要在系统内核中创建出线程
因为程序有时需要对软硬件资源进行操作。
完整示例
public class ThreadDemo1 {public static void main(String[] args) {Thread t new MyThread();t.start();while(true){System.out.println(main);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class MyThread extends Thread{Overridepublic void run() {while(true){System.out.println(MyThread);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
} 进程创建第一个线程时开销最大之后的线程开销都比较小但不是0main线程其实是第一个线程。 一直循环…… 当有多个线程它们的执行顺序是不确定的。 使用 jconsole 命令观察线程
我们可以使用jdk自带的工具 jconsole查看当前Java进程中所有的线程
第一步找到jdk 第二步点进去找到里面的bin文件点进去
第三步在bin文件夹里搜索jconsole 第四步找到你所创建进程点击线程进行查看 2.2实现 Runnable 接口
1) 实现 Runnable 接口 class MyRunnable implements Runnable { Override public void run () { System . out . println ( 这里是线程运行的代码 ); } } 2) 创建 Thread 类实例, 调用 Thread 的构造方法时将 Runnable 对象作为 参数. Thread t new Thread(new MyRunnable()); 3) 调用 start 方法 t.start(); // 线程开始运行 完整示例
public class ThreadDemo2 {public static void main(String[] args) {Thread t new Thread(new MyRunnable());t.start();while(true){System.out.println(main);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class MyRunnable implements Runnable{Overridepublic void run() {while(true){System.out.println(MyRunnable);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
} 这种写法其实就是把线程和要执行的任务进行了解耦合。 对比上面两种方法 : 1.继承 Thread 类 , 直接使用 this 就表示当前线程对象的引用 . 2.实现 Runnable 接口 , this 表示的是 MyRunnable 的引用 . 需要使用 Thread.currentThread() 2.3匿名内部类创建 Thread 子类对象 // 使用匿名类创建 Thread 子类对象 Thread t1 new Thread () { Override public void run () { System . out . println ( 使用匿名类创建 Thread 子类对象 ); } }; 完整示例
public class ThreadDemo3 {public static void main(String[] args) {Thread tnew Thread(){Overridepublic void run() {while (true){System.out.println(使用匿名类创建 Thread 子类对象);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};t.start();while(true){System.out.println(main);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}2.4匿名内部类创建 Runnable 子类对象 // 使用匿名类创建 Runnable 子类对象 Thread t2 new Thread ( new Runnable () { Override public void run () { System . out . println ( 使用匿名类创建 Runnable 子类对象 ); } }); 完整示例
public class ThreadDemo4 {public static void main(String[] args) {Thread tnew Thread(new Runnable() {Overridepublic void run() {while(true){System.out.println(使用匿名类创建Runnable子类对象);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}});t.start();while(true){System.out.println(main);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
2.5lambda 表达式创建 Runnable 子类对象 lambda就是让方法看上去脱离类单独存在。 // 使用 lambda 表达式创建 Runnable 子类对象 Thread t3 new Thread (() - System . out . println ( 使用匿名类创建 Thread 子类对象 )); Thread t4 new Thread (() - { System . out . println ( 使用匿名类创建 Thread 子类对象 ); }); 完整示例 public static void main(String[] args) {Thread tnew Thread(() - {while(true){System.out.println(使用匿名类创建Runnable子类对象);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();while(true){System.out.println(main);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
} 都看到这了不如关注一下给个免费的赞