进程:
应用程序的执行实例
线程:
CPU调度和分派的基本单位
多线程:
如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”
多个线程交替占用CPU资源,而非真正的并行执行
Thread类:
Java提供了java.lang.Thread类支持多线程编程
主线程:
main()方法即为主线程入口
产生其他子线程的线程
必须最后完成执行,因为它执行各种关闭动作
public static void main(String args[]) {
Thread t= Thread.currentThread();
System.out.println("当前线程是: "+t.getName());
t.setName(“MyJavaThread”);
System.out.println("当前线程名是: "+t.getName()); }
在Java中创建线程的两种方式:
1继承java.lang.Thread类
2实现java.lang.Runnable接口
步骤:
1.定义线程
2.创建线程对象
3.启动线程
4.终止线程
定义MyThread类继承Thread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
public class MyThread extends Thread{
//重写run()方法
public void run(){
for(int i=1;i<100;i++){ System.out.println(
Thread.currentThread().getName()+":"+i);
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); //启动线程
}
实现Runnable接口创建线程
定义MyRunnable类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
public class MyRunnable implements Runnable{
public void run(){
for(int i=1;i<100;i++){
System.out.println(
Thread.currentThread().getName()+":"+i);
}
}
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread myThread = new Thread(myRunnable);
thread.start(); //启动线程}
两种方式的区别?
1.继承Thread类
编写简单,可直接操作线程
适用于单继承
2.实现Runnable接口
避免单继承局限性
便于共享资源
线程的五种状态:
1.创建 2.就绪 3.运行 4.阻塞 5.死亡
第一是创建状态,在生成线程对象,并没有调用该对象的start方法,该线程处于创建状态。
第二是就绪状态。 当调用该线程的start方法之后,此时线程调用程序还没有把该线程设置为当前线程,该线程就进入就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程进入运行状态。开始运行run方法中的代码。
第四是阻塞状态。线程正处于运行状态的时候,被暂停。通常是为了等待某个事件的发生(比如说某项资源就绪)之后在继续运行。通常线程调用sleep、wait等方法都可以导致线程进入阻塞
第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于死亡的线程,无法在使用start方法令其进入就绪
线程调度指按照特定机制为多个线程分配CPU的使用权
方法如下:
线程优先级由1~10表示,1最低,默认优先级为5
优先级高的线程获得CPU资源的概率较大
线程休眠:
让线程暂时睡眠指定时长,线程进入阻塞状态
睡眠时间过后线程会再进入可运行状态
.sleep();
线程的强制运行:
使当前线程暂停执行,等待其他线程结束后再继续执行本线程
方法:
public final void join()
public final void join(long mills)
public final void join(long mills,int nanos)
millis:以毫秒为单位的等待时长
nanos:要等待的附加纳秒时长
需处理InterruptedException异常
线程的礼让:
暂停当前线程,允许其他具有相同优先级的线程获得运行机会
该线程处于就绪状态,不转为阻塞状态
方法:public static void yield()
**注意:**只是提供一种可能,但是不能保证一定会实现礼让