线程是程序中的执行线程。 JAVA 虚拟机允许应用程序并发的运行多个执行线程。每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是 守护线程 时,新线程才是守护程序。当Java虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的main方法)。Java虚拟机会继续执行线程,知道下列任意情况出现为止:调用 Runtime 类的exit方法,并且安全管理器允许退出操作发生。非守护线程的所有线程都已停止运行,无论是通过从对run方法的调用中返回,还是通过抛出一个传播到run方法之外的异常。
方法一:创建线程的方式一是直接extends Thread覆盖run()方法即可,这种实现方式的缺点是,一个Java类只能继承一个父类。
public class ThreadA extends Thread{
public void run(){
super.run();
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“这是线程A”);
}
public static void main(String[] args) {
ThreadA threadA=new ThreadA();
threadA.start();//启动线程
System.out.println(“这是主线程;”);
}
}
方法二:创建线程的第二种方式是实现Runnable接口,实现run()方法。最为常见的线程创建方式。
public class ThreadB implements Runnable{
@ Override
public void run() {
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“这是线程B”);
}
public static void main(String[] args) {
ThreadB threadB=new ThreadB();
new Thread(threadB).start();//注意启动方式有点不一样
System.out.println(“这里是主线程”);
}
}
方法三:创建线程的第三种方式是:implements Callable,实现call()方法可以得到线程的执行结果
public class ThreadC implements Callable<String>{
//实现Callable接口,实现call()方法
//可以有返回结果,注意这次是要覆盖call方法
public static void main(String[] args) {
ThreadC threadC=new ThreadC();
FutureTask<String> futureTask=new FutureTask<>(threadC);
new Thread(futureTask).start();//注意启动的方式不一样
System.out.println(“这是主线程:begin!”);
try {
System.out.println(“得到的返回结果:”+futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(“这是主线程:end!”);
}
@Override
public String call() throws Exception {
try {
//模拟执行逻辑500ms
Thread.sleep(500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“这是线程C”);
return “thread C”;
}
}