多线程技术
线程与进程
进程是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间。
线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程。
线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。
JAVA 创建线程
方法一、 继承Thread创建线程
直接上代码:
public class MyThread extends Thread{
/**
* run方法就是线程要执行的任务方法
*/
@Override
public void run() {
//这里的代码就是一条新的执行路径
//这个执行路径的触发方法,不是调用run方法,而是通过thread对象的start()方法在执行(在main方法中演示)
for(int i = 0;i<5;i++){
//随便执行一个任务
System.out.println("黑云压城城欲摧"+i);
}
}
}
创建一个继承线程Tread类的子类MyTread,编写run方法(IDEA中就提示)。
下面在main方法中调用刚创建的线程
public class 继承Thread {
public static void main(String[] args) {
//创建一个MyThread的对象,用于调用线程。
MyThread myThread = new MyThread();
//执行线程中的run任务方法,注意使用start()方法调用而不是run()
myThread.start();
//主线程中随便编写一个任务,用于观察两个线程的执行顺序
for(int i = 0;i<5;i++){
System.out.println("甲光向日金鳞开"+i);
}
}
}
运行结果:
甲光向日金鳞开0
黑云压城城欲摧0
甲光向日金鳞开1
黑云压城城欲摧1
甲光向日金鳞开2
黑云压城城欲摧2
黑云压城城欲摧3
黑云压城城欲摧4
甲光向日金鳞开3
甲光向日金鳞开4
Process finished with exit code 0
因为JAVA中,各线程之间采用抢占式调度。所以每次运行结果会出现异同,但可以看出主线程和myThread线程之间并发执行。
方法二、 实现Runnable方法创建线程
* 实现runable与继承thread相比有如下优势:
* 1.通过创建任务给线程分配的方式来实现多线程,更适合多个线程同时执行相同任务的情况
* 2.可以避免单继承所带来的局限性
* 3.任务与线程分离,提高程序的健壮性
* 4.后续学习的线程池中,接收runable类型的任务,而不接收thread类型的线程。
直接上代码
public class MyRunable implements Runnable{
/**
* 用于给线程执行的任务
*/
@Override
public void run() {
for(int i = 0;i<5;i++){
System.out.println("角声满天秋色里"+i);
}
}
}
Runable是接口方法,创建一个MyRunable实现Runable接口后,也要编写一段run任务方法。
下面是main方法中调用MyRunable
public static void main(String[] args) {
//创建一个任务对象
MyRunable myRunable = new MyRunable();
//创建一个线程并给它myRunable的任务
Thread thread = new Thread(myRunable);
thread.start();
for(int i = 0;i<5;i++){
System.out.println("塞上燕脂凝夜紫"+i);
}
}
运行结果
塞上燕脂凝夜紫0
角声满天秋色里0
塞上燕脂凝夜紫1
角声满天秋色里1
塞上燕脂凝夜紫2
角声满天秋色里2
塞上燕脂凝夜紫3
角声满天秋色里3
塞上燕脂凝夜紫4
角声满天秋色里4
方法三、带返回值的线程Callable(不常用)
上代码
static class MyCallable implements Callable<Integer>{
//值对返回值为Integer型
@Override
public Integer call() throws Exception {
for (int i = 0;i<5;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
//返回值为100
return 100;
}
}
在main方法中调用MyCallable
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable callable = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);
new Thread(futureTask).start();
//获取子线程 MyCallables的返回值
//主线程会在子线程get()结束后才执行
int c = futureTask.get();
System.out.println("子线程的返回值为:"+c);
for (int i = 0;i<4;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
运行结果
0
1
2
3
4
子线程的返回值为:100
0
1
2
3
Process finished with exit code 0
以上就是JAVA线程中创建线程的方法,最常用的是Runable接口创建线程任务。本人还是JAVA初学者,刚开始尝试写博客,如有问题,还请大家多多指定,十分感谢!