目录
认识线程
程序 进程 线程
特点·:
创建线程
继承Thread类的方法
实现Runnable接口的方法
Tread类中的方法
线程状态
认识线程
程序 进程 线程
- 程序(program):是为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码。
- 进程(process)正在内存中运行的应用程序,如运行中的QQ,运行中的音乐播放 器。进程是操作系统进行资源分配的最小单位.
- 线程(thread)进程可进一步细化为线程,是一个进程内部的最小执行单元,是操 作系统进行任务调度的最小单元,隶属于进程
特点·:
- 一个进程可以包含多个线程,线程不能脱离进程而独立运行;
- 每一个进程至少包含一个线程(称为主线程);
- 在主线程中可以创建并启动其它的线程
- 一个进程内的所有线程共享该进程的内存资源
创建线程
继承Thread类的方法
在Java中要实现线程,可以继承Tread类,重写其中的run方法。
方法原型:
Thread类中的run方法本身并不执行任何操作,如果我们重写runf方法,当它启动时,将执行run方法
定义:
public class MyThread extends Thread {
public void run() { }
}
调用:
MyThread thread = new MyThread();
thread.start();
实例
package com.wyk.javathread.demo1;public class Text {/*启动Java主线程*/public static void main(String[] args) {//创建一个其他线程MyThread myThread = new MyThread();myThread.start();//此for属于main线for (int i = 0; i <1000 ; i++) {System.out.println("main:"+i);}}
}
package com.wyk.javathread.demo1;
public class MyThread extends Thread {/*线程中要执行的任务,*/@Overridepublic void run() {for (int i = 0; i <1000 ; i++) {System.out.println("MyThread:"+i);}}
}
实现Runnable接口的方法
实现Runnable接口的方式
● java.lang.Runnable接口中仅仅只有一个抽象方法:
public void run()
● 也可以通过实现Runnable接口的方式来实现线程,只需要实现其中的run方法即可;
● Runnable接口的存在主要是为了解决Java中不允许多继承的问题。
定义:
public class MyTask implements Runnable{
@Override public void run() {
……
}
}
创建任务
MyTask myTask = new MyTask ();
创建一个线程,把任务交给线程执行
Thread thread = new Thread(myTask);
thread.start();
实例
public class Test {public static void main(String[] args) {Task task = new Task();Thread thread = new Thread(task);//创建了一格线程对象}
}
public class Task implements Runnable{@Overridepublic void run() {for (int i = 0; i <1000; i++) {System.out.println("Task:"+i);}}/*实现了Runable的接口的类,并不是线程是把要执行的任务放在此类的run()中,这个类就可以看作是一个任务类run() 写线程要执行的任务*/
}
实现Runnable接口方式的好处
1)避免了单继承的局限性
2)多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源。
Tread类中的方法
public class Test {public static void main(String[] args) throws InterruptedException {Task task = new Task();/*Thread (Runnable r) 接收一个实现了Runnable接口的实现子类Thread(Runnable r, String name)接收了实现了Runnable接口的实现子类,还可以为线程定义名称setPriority(10) 设置线程优先级 优先级取值1-10; 默认为5;此方法写在哪一个线程中,让哪个线程休眠*/Thread thread1= new Thread(task,"窗口1");Thread thread2 = new Thread(task,"窗口2");thread1.setName("线程1");//thread1.setPriority(1);//thread2.setPriority(10);//Thread.sleep(20000);thread1.start();thread1.join();//让其他线程等待调用了join的线程执行完System.out.println(Thread.currentThread().getPriority());}}
public class Task implements Runnable{@Overridepublic void run() {for (int i = 0; i <100 ; i++) {//System.out.println(Thread.currentThread());//返回当前次任务的线程对象//System.out.println(Thread.currentThread().getName()+Thread.currentThread().getId());// getName 获取线程的名字 getId 获取线程idint a= 0;while (a<10){a++;}System.out.println(new Date());}}
}
线程优先级
● 计算机只有一个CPU,各个线程轮流获得CPU的使用权,才能执行任务;
● 优先级较高的线程有更多获得CPU的机会;
● 优先级用整数表示,取值范围是1~10,一般情况下,线程的默认优先级都是5, 但是也可以通过setPriority和getPriority方法来设置或返回优先级;
Thread类有如下3个静态常量来表示优先级
● MAX_PRIORITY:取值为10,表示最高优先级。
● MIN_PRIORITY:取值为1,表示最底优先级。
● NORM_PRIORITY:取值为5,表示默认的优先级
线程状态
线程在它的生命周期中会处于不同的状态:
- 新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对 象处于新建状态
- 就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时 间片,此时它已具备了运行的条件,只是没分配到CPU资源
- 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run ()方法定义了线程的操作和功能
- 阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出 CPU并临时中止自己的执行,进入阻塞状态
- 死亡:线程完成了它的全部工作或线程被提前强制性地中止或出现异常 导致结束