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);
}
}
}