java 线程 (一) Thread
package cn.sasa.demo1; public class Test { public static void main(String[] args) throws InterruptedException { /** * 进程: * 进程指正在运行的程序。当一个程序进入内存运行,即变成一个进程 * 进程是处于运行过程中的程序,并具有一定独立功能 * * 线程: * 线程是进程中的一个执行单元,负责当前进程中程序的执行 * 一个进程至少有一个线程,一个进程可以有多个线程 * * 线程的运行模式: * a、分时调度 * 所有线程 轮流使用 CPU的使用特权,平均分配每个线程占用CPU 的时间 * * b、抢占式调度 * 优先让 优先级高的线程使用CPU, 如果线程的优先级相同,那么就随机选择一个(线程的随机性) * java使用抢占式调度 * * 对于CPU的一个核而言,某个时刻,只能执行一个线程, * 多线程程序并不能提高程序的运行速度,但能提高程序运行效率,让CPU的使用率更高 * * 创建线程的目的: * 建立程序单独运行的执行路径,让多部分代码实现同时执行。 * * 创建新执行线程有两种方法: * a、声明Thread的子类,重写run方法。创建对象,开启线程。run相当于其他线程中的main方法 * b、声明Runnable接口的实现类,实现run方法。 * * public class Thread implements Runnable {...} * * public interface Runnable { * public abstract void run(); * } * * 为什么调用Thread的start方法 而不是直接调用 run方法 * run方法不开启线程,只是调用对象的方法 * start开启线程,并让JVM调用run方法在开启的线程中执行 * * * */ //Thread子类创建线程 MyThread th1 = new MyThread(); th1.setName("线程名字");//修改名字要在start之前,一般不需要修改 th1.start(); th1.getName(); //Runnable接口的方式 //一般用这种方式,将执行的任务分离出来 Thread th3 = new Thread(new MyRunnable()); th3.start(); //currentThread 当前执行的线程 System.out.println(Thread.currentThread().getName()); //使用匿名内部类,实现多线程 //方式一:继承 //方式二:实现接口 new Thread() { public void run() { System.out.println("lalalala"); } }.start(); new Thread(new Runnable() { public void run() { System.out.println("hahaha"); } }).start(); for(int i=0; i<5; i++) { //sleep 休眠多少毫秒 Thread.sleep(1000); System.out.println(i); } } }
package cn.sasa.demo1; public class MyThread extends Thread{ public void run() { System.out.println(getName()); for(int i=0;i<60;i++) { System.out.println("thread1-----run"+i); } } // public MyThread() { // super("线程的名字1"); // } }
package cn.sasa.demo1; public class MyRunnable implements Runnable{ @Override public void run() { for(int i = 0; i<60; i++) { System.out.println("runnable......"+i); } } }