线程
刚刚接触线程这个概念是上学期的操作系统,线程作为进程的组成部分,进程就是程序进入内存运行的名称,可以说,线程对于计算机来说是不可或缺的一部分。、
Java对多线程提供了非常优秀的支持,使之可以通过简便的方式在程序中创建多线程。
多线程的优点:
- 多线程之间共享内存,节约系统资源成本
- 充分利用CPU,执行并发任务效率高
- java内置多线程功能支持,简化了编程的模型
- GUI应用通过启动单独线程收集用户界面事件,简化异步事件处理,使GUI界面的交互性更好
Java线程模型有Thread类、Runnable接口、Callable接口和Future接口。
Thread类中run()方法用于执行线程要完成的任务;这个类中还有start()方法用于线程的启动。
Runnable接口中只有一个抽象方法run()方法,用于执行线程中所要完成的任务。
Callable接口中提供了一个call()方法,call()方法对于run()方法来说,它可以有返回值,也可以声明抛出异常。
Future接口则是用来接收Callable接口中call()方法的返回值。
对于每个进程来说,其中必定是包含一个主线程的,该线程是用来执行main()方法的,可以通过Thread类中的currentThread()来获取主线程。
创建线程
在java中有三种可以创建线程的方法
- 继承Thread类,重写run()方法,直接创建线程
- 实现Runnable接口,再通过Thread类和Runnable的实现类间接创建线程
- 使用Callable和Future接口间接创建线程
方法一:
public class ThreadDemo extends Thread{
public void run(){
for(int i=0;i<100;i++){
System.out.println(this.getName()+":"+i);
}
}
public static void main(String[]args}{
ThreadDemo td=new ThreadDemo();
td.start();
for(int i=1000;i<1100;i++){
System.out.println(Thread.currentThread()+":"+i);
}
}
}
start()方法用于对线程的启动,因此不能多次使用。
方法二:
class ThreadTask implements Runnable{
public void run(){
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public class RunnableDemo{
public static void main(String[]args}{
Thread t=new Thread(new ThreakTask());
t.start();
for(int i=1000;i<1100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
方法三:
class Task implements Callable<Integer>{
public Integer call() throw Exception{
int i=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
return i;
}
}
public class CallableFutureDemo{
public static void main(String[]args}{
FutureTask<Integer> task=new FutureTask<Integer>(new Task());
new Thread(task,"子线程").start();
try{
System.out.println("子线程返回值:"+task.get());
}catch(InterruptedException e){
e.printStackTrace();
}catch(ExceptionException e){
e.printStackTrace();
}
for(int i=1000;i<1100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
在Java8中,可以直接使用Lambda表达式创建Callable对象
Lambda表达式:
(Callable<Integer>)()->{
int i=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
return i;
}
随着科技的发展,知识的进步,线程的创建会更加简单,但是,它的重要性不会因为方法的简单而减少。