J2se(12)
多线程
------------------------------------------------
进程: 一个正在计算机中运行的程序,就称为一个进程
打开迅雷------>开启了一个进程
迅雷可以同时下载多个任务,每一个下载任务,就是一个线程
线程是进程之中,一个独立的执行单元
一个进程,可以包含多个线程
一个线程,一定隶属于某一个进程
任何程序要运行,至少要有一个线程,如果只有程序中只有一个线程,它就是“主线程”
程序中的主函数,其实就是主线程
除了主线程之外的其他线程,都统称为"子线程"
创建线程的方式有两种:
1、编写类继承于Thread 类
2、编写类实现Runnable接口
---------------------------------------------------------
第一种方式: 继承于Thread
1、编写类继承于Thread类
2、重写类中的方法 run();该方法称为"线程体"------线程要做的事情,都应该在这里编写
3、创建自己编写的线程类,并且启动线程
4、调用线程对象.start();启动线程
----------------------------------------------------------------------------------
CPU负责调度,当前应该由哪一个任务来运行,每一个任务,其实就是一个线程
CPU在某一具体的时间,只能去执行一个线程
CPU会把计算机要执行的时候任务,划分成很多时间片段
CPU它在调度的时候,先让线程A运行几毫秒然后让线程A停下来,再让线程B运行几毫秒,然后再让线程B停下来,然后再让其他线程运行一会儿,再停下来,可能又会让A运行一会儿,由于它们之间间隔的时间非常短,对于用户来说,是感觉不到的。
当创建好线程实例以后,调用线程的start方法,该线程并不会马上就运行,当线程的start方法被调用以后,系统就会把该线程加入到CPU线程池中(等待CPU调度的线程,都会在线程池中排队),并且会给CPU发出一条信息,当前这个线程已经准备就绪,可以随时调用
cpu从线程池中调用线程时,是随机调用,它会让线程A先运行一会儿(几毫秒),然后让线程A停下来,然后再随机的从线程池选择一个线程来运行,运行一会儿,又会让当前线程停下来,再随机的选择一个线程来运行
当一个线程要执行的任务,执行完成以后,线程也就会自动销毁了
-----------------------------------------------------------------------------------
线程的常见方法:
setPriority(int); //用于设置线程的优先级
10---优先级最高
1----优先级最低
5---正常频率
sleep(毫秒); //让当前的线程在指定的时间内休眠,休眠的过程,CPU不会再调用当前线程,一直到休眠的时间到达以后,CPU才会重新调用
如果线程类,是通过继承Thread成为线程类,那么可以直接调用 sleep()进行休眠
如果不是继承于Thread类,那么要休眠,就需要调用 Thread.sleep();进行休眠
如果调用线程的stop方法终止线程,会产生一些不安全因素,以及造成一些资源
-----------------------------------------------
第二种方式成为线程: 实现Runnabel接口
1、编写类实现接口Runnabel
2、实现接口的方法run()----线程体
3、创建自己编写的线程类的实例
MyThread mt = new MyThread();//创建线程类实例
4、创建一个线程Thread,并且把mt做为参数,传递进去
Thread t = new Thread(mt);
5、启动线程
t.start();
因为java中,不允许多继承,如果自己编写的类继承于Thread成为线程,那么,就再也没有办法继承于其他类了
java中,类可以在继承类的同时,再实现其他接口
如果选择实现接口成为线程类,这个时候,你还可以继承于其他类,拥有其他类的特点
在什么时候,选择哪一种方式成为线程会比较方便?
1、继承于Thread类
2、实现Runnable接口
如果当前的类,只是单纯的做线程类来使用,这时候选择继承Thread类会更方便
如果当前类,不但要拥有线程类的特点,还想继承于其他类,就只能选择实现Runnable接口