# 线程学习笔记 ## 并发与并行 * 并发:单核执行多任务切换 * 并行:多核同一时刻执行多个任务 * tips **并发与并行可能同时存在** ``` java // 获取当前电脑cpu个数 Runtime runtime = Runtime.getRuntime(); System.out.println(runtime.availableProcessors()); ``` ## JAVA创建线程 * 1.继承Thread类 重写run方法 * 2.实现Runnable接口 重写run 方法 * tips Thread 类实现了Runnable接口 、 * 可以用 **jconsole** 监控java进程的线程 ``` java public class Thread01 { public static void main(String[] args) throws InterruptedException { Cat cat = new Cat(); cat.start(); for(int i=0;i<40;i++) { Thread.sleep(1000); System.out.println(i); } System.out.println(Thread.currentThread().getName()); } } class Cat extends Thread{ @Override public void run() { int i = 0; while (true) { i++; try { System.out.println(Thread.currentThread().getName()); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if(i==60) { break; } } } } ``` ## 为什么要执行子进程调用的是start方法而不是run方法? * 如果直接执行run 方法则无法创建新的线程,只是单单执行了run方法 * 源码中start0 是本地方法,由JVM调用 是C/c++实现 这才是能创建线程的关键 * 线程机制是与操作系统相关。 ## 用runnable方式创建线程 * runnable底层使用了静态代理设计模式 ``` java public class ThreadRunnable { public static void main(String[] args) { ThreadRun threadRun = new ThreadRun(); Thread thread = new Thread(threadRun); thread.start(); System.out.println(Thread.currentThread().getName()); } } class ThreadRun implements Runnable { int i = 0; @Override public void run() { while (true) { i++; System.out.println(i + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if(i == 10) { break; } } } } ```