初学Java之后,下面是我对线程的理解,分享给大家。
首先,我们得了解线程是什么?
线程的定义:进程中的一个执行流程,是程序执行流的最小单元。
线程的作用:执行一段或一组代码,这组代码也通常称为任务。
我们多多少少都听说,代码的执行效率跟CPU是有关的。为什么有关呢。这时候我们就要去了解CPU跟线程的关系?
线程是CPU调度和分配的基本单位。
线程自己是不能执行自己的任务的,它需要一个执行环境,而CPU就是这个环境。
所以任务,线程,CPU的关系如下图:
了解了线程的执行原理之后,我们又要了解,为什么要用多线程。
这个问题的答案百度也一大堆,就是为了充分利用CPU资源
在一个程序中只有主线程,但可以有多个子线程。如果我们的程序只有一个线程执行整个程序的代码,那么效率就会很低。所以上面答案很容易理解。
下面是创建线程的方法
第一种、继承Thread类,重写run方法,然后调用start方法启动线程。
代码实现如下:
public class ThreadDemo {
public static void main(String[] args) {
Thread01 thread=new Thread01();
Thread01 thread2=new Thread01();
thread.start();
thread2.start();
}
}
class Thread01 extends Thread{
@Override
public void run() {
System.out.println("线程的id:" + getId());
System.out.println("线程的名称:" + getName());
for (int i = 0; i < 50; i++) {
System.out.println("线程的id:" + getId() + " 线程的名称:"
+ getName());
}
}
}
第二种、实现Runnable接口,重写run方法,调用start方法启动线程。
public class ThreadDemo {
public static void main(String[] args) {
Thread01 thread=new Thread01();
Thread thread1 = new Thread(thread);
Thread thread2 = new Thread(thread);
thread1.start();
thread2.start();
}
}
class Thread01 implements Runnable{
@Override
public void run() {
//实现Runnable接口的,无法直接使用getId(),getName()等方法
// 需要使用Thread.currentThread() 来获取到当前对象才行
System.out.println("线程的id:" + Thread.currentThread().getId());
System.out.println("线程的名称:" + Thread.currentThread().getName());
for (int i = 0; i < 50; i++) {
System.out.println("线程的id:" + Thread.currentThread().getId() + " 线程的名称:"
+ Thread.currentThread().getName());
}
}
}
第三种、(可带返回值)使用Callable和FutureTask,重写call方法。
代码如下:
public static String fun() throws InterruptedException, ExecutionException{
//创建Callable实例,给定返回类型为String
Callable<String> callable=new Callable<String>() {
//重写call方法
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
Random random=new Random();
int i=random.nextInt(50);
//返回一个随机数
return String.valueOf(i);
}
};
//创建FutureTask实例,包装callable对象
FutureTask<String> futureTask=new FutureTask<String>(callable);
//创建并启动线程
new Thread(futureTask).start();
//调用get方法回去返回值。
String str=futureTask.get();
return str;
}
调用代码如下:
public static void main(String[] args) throws InterruptedException, ExecutionException {
// TODO Auto-generated method stub
String str= Demo.fun();
System.out.println(str);
}
结果如下: