进程的概念:正在运行的程序,是系统进行资源分配和调用的独立单位,每一个程序都有它自己的内存空间和系统资源(我们的通过任务管理器就能看到进程的存在,只有运行的程序才有进程)
多线程:在同一个进程里面可以执行多个任务。而每一个任务可以看成一个线程。线程是 程序的执行单元,执行路径,是程序使用cpu的最基本单位。
单线程:如果程序只有一条执行路径。
多线程:如果程序有多条执行路径。
多线程的存在不是提高程序的速度,是提高程序的使用率
package com.demo;
import java.util.Date;
public class MyThread extends Thread {
// getName()获取进程的名字;
@Override
public void run() {
for (int i = 0; i <1000; i++) {
// System.out.println(getName()+":"+i);
System.out.println(getName()+"---"+new Date());
try {
Thread.sleep(1000);//每一个进程休眠1秒,一秒每个进程都跑了一次
} catch (InterruptedException e) {
e.printStackTrace();
}
/*Thread.yield(); 线程礼让方法
暂停当前线程的执行,让其他的先执行后在自己执行,让多个线程执行更和谐,但不能做到你一次我一次
* */
}
}
}
package com.demo;
public class Test {
public static void main(String[] args) {
MyThread myThread = new MyThread();
MyThread myThread2 = new MyThread();
myThread.setName("线程一");//设置线程的名字,默认是Thread-0,累增
myThread2.setName("线程二");
// myThread.start();
// myThread2.start();
System.out.println(Thread.currentThread().getName());//得到当前线程的名字
/*线程有两种调度模式
1分时调度模型(比如一个线程先用五分钟接着另个线程用五分钟)
2抢占式调度模型(优先级高的优先用CPU,相同随机,低的后用),
线程级别是1~10,10最高,默认5
*/
System.out.println(myThread.getPriority());//获取线程的默认优先级,默认值是5
myThread.setPriority(10);
/**
* join的使用,等待某个线程结束了,其他的线程才能走
*/
myThread.start();
try {
myThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myThread2.start();//等myThread走完了myThread2才能开始跑
/**
* setDaemon()方法设为守护线程,主线程跑完守护线程就结束,并不是立马结束,有自杀颤抖时间
*/
MyThread th1 = new MyThread();
MyThread th2 = new MyThread();
th1.setName("关羽");
th2.setName("张飞");
th1.setDaemon(true);//设置为守护线程
th2.setDaemon(true);//设置为守护线程
Thread.currentThread().setName("刘备");//主线程
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
/**
* 中断线程
* th1.stop();停止线程,不建议使用方法过时了,但还可以用
* th1.interrupt();中断线程,把线程的状态终止,建议使用并抛出异常,异常走完后,后面的方法也会走完
* (run里的完整的方法走完后才终止线程,退出jvm)
*/
th1.interrupt();
}
}
package com.demo;
public class MyRunable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println(Thread.currentThread().getName()+"---"+i);
}
}
}
package com.demo;
/**
* 线程实现方式2,实现接口runnable接口
* @author anjin
*
*/
public class MyRunableTest {
public static void main(String[] args) {
MyRunable myRunable = new MyRunable();//子类对象
Thread th1 = new Thread(myRunable);//线程1
Thread th2 = new Thread(myRunable);
th1.setName("线程1");
th2.setName("线程2");
th1.start();
th2.start();
}
}
线程池: