1.多任务处理
多任务处理分为两种不同的类型:基于进程的多任务处理和基于线程的多任务处理。
进程:进程是运行的程序,是操作系统进行调度和资源分配的基本单元。进程有独立的内存空间,进程间的通信和进程间的上下文切换的开销比较大。
线程:进程由线程组成,线程是比进程更小的单元,是CPU进行调度的基本单元。线程之间共享一个进程的内存空间,线程间通信和上下文切换的开销相对较小。
虽然Java程序使用基于多进程的多任务环境,但是基于多进程的多任务处理并不是由Java控制的。不过,基于多线程的多任务处理是由Java控制的。
2.线程的优先级
Java为每个线程都指定了优先级,线程的优先级用于在上下文切换中决定把CPU的执行权交给哪个线程。
理论上,优先级高的线程将拥有更多的执行时间,而同优先级的线程有相同的运行时间。
Java中线程的优先级可以通过Thread类的setPriority(int p)方法设定优先级,优先级的取值区间为[1,10],1最低,10最高,5为默认优先级
3.获取操作当前线程
Java中使用Thread类的currentThread()方法来获取当前线程,返回值是一个Thread对象。
获取操作当前线程的代码如下:
public class MainThread {
/*
* 所有的线程都是在主线程之上创建而来的
*/
public static void main(String[] args) {
Thread t = Thread.currentThread();
System.out.println(t);
t.setName("My-mainThread");
System.out.println(t);
}
/*
* 输出结果:
* Thread[main,5,main]
* Thread[My-mainThread,5,main]
* 中括号中依次是:[线程名称、线程优先级、线程所属线程组名称]
* 线程优先级可以设置,优先级越大越好,范围是[1,10],默认优先级是5
*/
}
4.创建线程
创建线程有两种最基本方式(后续博文会探讨其他创建线程的实现):一种是扩展Thread类,然后重写run方法,然后创建该线程的对象,调用该对象的start方法即可使线程启动(start方法内部就是调用了run方法);一种是实现Runnable接口,然后实现run方法,然后创建线程类(把扩展了接口的类作为构造器参数传进去),然后调用该线程的start方法即可使线程启动,当然,在Java8之后,由于Runnable接口是一个函数式接口,可以使用lambda表达式更简单的使用第二种方式,本次还是使用旧式的,后续博文采用lambda表达式的形式。
实例代码如下:
public class CreateThreadsByTwoWays {
public static void main(String[] args) {
Thread t1 = new Thread(new T1());
t1.start();
Thread t2 = new T2();
t2.start();
for(int i = 0;i<6;i++){
System.out.println("main Thrad... "+i);
}
}
//运行结果
// by implementing Runnable... 0
// by extending Thread... 0
// main Thrad... 0
// by extending Thread... 1
// by implementing Runnable... 1
// by extending Thread... 2
// main Thrad... 1
// main Thrad... 2
// by extending Thread... 3
// by extending Thread... 4
// by implementing Runnable... 2
// by extending Thread... 5
// main Thrad... 3
// main Thrad... 4
// main Thrad... 5
// by implementing Runnable... 3
// by implementing Runnable... 4
// by implementing Runnable... 5
}
//实现Runnabl接口
class T1 implements Runnable{
//在Java8中这种使用Runnable的方式不多了,使用lambda表达式创建更方便
@Override
public void run() {
for(int i = 0;i<6;i++){
System.out.println("by implementing Runnable... "+i);
}
}
}
//扩展Thread类
class T2 extends Thread{
@Override
public void run(){
for(int i = 0;i<6;i++){
System.out.println("by extending Thread... "+i);
}
}
}