实现多线程的方式
线程依赖于进程而存在,进程由系统创建的,因此需调用系统功能创建一个进程,Java不能直接调用系统功能,所以没办法实现多线程技术,但是,Java可以调用C/C++写好的程序实现多线程,由C/C++去调用系统功能创建进程。提供一些类,由Java去调用。
1. 继承Thread类
1.1 自定义类继承Thread类
1.2 重写run()方法
1.3 创建对象
1.4 启动线程
run()方法:仅仅封装了线程执行的代码,直接调用是普通的方法。
start()方法:首先启动了线程,然后由JVM去调用该线程的run()方法。
线程的两种调度模型
1.分时调度,所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片。
2.抢占式调度模型:优先让优先级高的线程使用CPU,相同则随机选择一个,优先级高的线程获取的CPU时间片相对多一点。
Java默认使用抢占式调度模型
设置优先级的方式优先级(1-10)默认为5:
public class MyThread {
public static void main(String[] args) {
ThreadTest th1=new ThreadTest("th1");
ThreadTest th2=new ThreadTest("th2");
ThreadTest2 th3=new ThreadTest2("th3");
th1.start();
try {
th1.join();//线程th1执行完成才执行下面的线程
} catch (InterruptedException e) {
e.printStackTrace();
}
th2.setPriority(10);//设置线程优先级
th2.setDaemon(true);//设置为守护线程,当正在运行的线程都是守护线程,java虚拟机退出,该方法必须在启动前调用
th2.start();
th3.start();
}
}
class ThreadTest extends Thread{
public ThreadTest() {}
public ThreadTest(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<200;i++) {
try {
Thread.sleep(10);//线程休眠MS
System.out.println(getName()+" "+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ThreadTest2 extends Thread{
public ThreadTest2() {}
public ThreadTest2(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<100;i++) {
Thread.yield();//交出执行权,执行更和谐,不能保证线程交替执行
}
}
}
线程方法:
- Thread.sleep(10);//线程休眠MS
- MyThread.join();//线程执行完毕,其他线程才能执行
- Thread.yield();//交出执行权,执行更和谐,不能保证线程交替执行。
- th2.setDaemon(true);//设置为守护线程
实现runnable接口
class ThreadTest3 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
实现callable 接口
使用ExecutorService、Callable、Future实现有返回结果的多线程
class MyCallable implements Callable<Object> {
private String taskNumg;
MyCallable(String taskNumg) {
this.taskNum = taskNumg;
}
public Object call() throws Exception {
System.out.println(">>>" + taskNumg + "任务启动");
Date dateTmp1 = new Date();
Thread.sleep(1000);
Date dateTmp2 = new Date();
long time = dateTmp2.getTime() - dateTmp1.getTime();
System.out.println(">>>" + taskNumg + "任务终止");
return taskNumg + "当前任务时间【" + time + "毫秒】";
}
}