进程的概念:
应用程序的执行示例>>>>>进程<<<<<有独立的内存空间和系统资源
线程的概念:
CPU调用和分派的基本单位》》》线程《《《进程中执行运算的最小单位,可完成一个独立的顺序控制流程
---------------------------------------------------------------------------------------------------------
什么是多线程:
1、如果在一个进程中同事运行了多个线程,用来完成不同的工作,则称之为"多线程"
2、多个线程交替占用CPU资源,而非真正的并行执行
多线程的好处:
1、充分利用CPU的资源
2、简化编程模型
3、带爱良好的用户体验
---------------------------------------------------------------------------------------------------------
Thread类
java提供了java.lang.thread类支持多线程编程
主线程:
1、main()方法即为主线程入口
2、产生其他子进程的线程
3、必须最后完成执行,因为他执行各种关闭动作
---------------------------------------------------------------------------------------------------------
currentThread:获得设置线程名字
示例:public static void main(String[] args) {
//1、获取主线程对象
Thread t=Thread.currentThread();
System.out.println("当前线程是:"+t.getName()); //是main
//设置线程名字
t.setName("MyJavaThread");
//再看名字、
System.out.println("改完名字后线程名字:"+t.getName());//是MyJavaThread
---------------------------------------------------------------------------------------------------------
继承Thread类创建线程
(1) 1、定义MyThread类继承Thread类 (以Thread结尾一看就知道是线程类)
2、重写run()方法,编写线程执行体 (带大小写拼写一定不要变)
3、创建线程对象、调用start()方法启动线程
(2) 1、多个线程交替执行,不是真正的"并行"!
2、线程每次执行时长由分配的CPU时间片长度决定!
示例:Thread-1:内容
Thread-1:内容 每次执行线程的毫秒不一样,执行也是随机的线程!
Thread-2:内容
Thread-1:内容
--------------------------------------------------------------------------------------------------------
继承Thread类创建线程:第一种方法run
Run方法示例:
创建
public class run extends Thread{
//重写run()方法
public void run(){
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public static void main(String[] args) {
使用
public static void main(String[] args) {
run r=new run();
run b=new run();
//1、启动线程
r.start();
b.start();
//直接使用run的1、只有主线程一条执行路径 2、一次调用了两次run()方法
r.run();
b.run();
注意:1、一定要继承Thread
2、重写run方法,里面写线程需要的操作
3、使用Start来启动线程的,线程处于待命的状态,分配了资源之后就可以执行线程了
--------------------------------------------------------------------------------------------------------
继承Thread类创建线程:第二种方法Runnable
实现Runnable接口创建线程
1、定义MyRunnable类实现Runnable接口
2、实现run()方法,编写线程执行体---------------------------这个run方法不去实现的话会报错
3、创建线程对象,调用start()方法启动线程
示例:public class Thread_Runnable implements Runnable {
//重写run方法
public void run(){
for(int i =1;i<100;i++)
System.out.println(Thread.currentThread().getName()+":"+i);
}
//开始用了
Thread_Runnable a=new Thread_Runnable();
Thread b=new Thread(a,"MyThread");//改了线程名
//启动线程
b.start();
注意:1、要写implements Runnable接口
2、必须要实现Run
3、创建线程对象 1、先创建一个Runnable实现类的对象 2、将实现类作用参数
--------------------------------------------------------------------------------------------------------
比较两种创建线程的方式run 和Runnable
继承Thread类 run
1、编写简单,可直接操作线程
2、适用于单继承
实现Runnable接口 Runnable ----------------- 推存使用实现Runnable方式创建线程
1、避免单继承局限性
2、便于共享资源
---------------------------------------------------------------------------------------------------------
总结以上内容:
1、创建线程有2种方式
继续Thread类
实现Runnable接口
2、启动线程
start()方法
3、线程对象调用start()方法和调用run()方法的区别
run():只能主线程一条执行路径
Runnable:多条执行路径,主线程和子线程并行交替执行
---------------------------------------------------------------------------------------------------------
线程的状态和调度
5种状态:
1、创建状态 》》 2、就绪状态 》》3、运行状态》》 (有可能会到4、阻塞状态)4、阻塞状态 》》5、死亡状态
--------------------------------------------------------------------------------------------------------
调度:
Thread.sleep(500);是休息5秒继续运行,里面一般是毫秒
setPriority(int newPriority); 更改线程的优先级
join();等该线程终止
Thread.yield();暂停当前正在执行的线程对象,并执行其他线程
interrupt();中断线程
boolean isAlive();测试线程是否处于活动状态
线程优先级由1~10表示,1最低,默认优先级为5
优先级高的线程获得CPU资源的概率较大
---------------------------------------------------------------------------------------------------------