线程是程序中的执行线程。java虚拟机允许应用程序并发地运行多个执行线程。每个线程都有一个优先级,高优先级线程的执行优先于低优先级的线程。当某个线程中运行的代码创建一个新Thread对象时,该新线程的初始化优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。当java虚拟机启动时,通常都会有一个单独非守护线程(通常用来调用“main()”函数)。JAVA虚拟机会继续执行线程,直到下列情况出现:
1. 调用了Runtime 类的exit方法,并且安全管理器允许退出操作的发生
2. 非守护线程的所有线程都已经停止运行,无论是通过对run方法的调用中返回,还是抛出一个传播到run方法之外的异常
线程的三种简单实现
1.使用extends Thread覆盖run()方法:
package Thread;
public class threadTest_1 extends Thread {
public void run()
{
super.run();
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("这是线程A");
}
public static void main(String args[])
{
threadTest_1 a = new threadTest_1();
a.start();
System.out.println("这是主线程");
}
}
输出为:
这是主线程
这是线程A
2.实现Runnable接口,实现run()方法。
package Thread;
public class threadTest_2 implements Runnable{
public void run()
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("这是进程B");
}
public static void main(String args[])
{
threadTest_2 b = new threadTest_2();
new Thread(b).start();
System.out.println("这是主线程:");
}
}
输出为:
这是主线程:
这是进程B
3.第三种实现方式是implements Callable,实现call()方法可以得到线程的执行结果
package Thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class threadTest_3 implements Callable<String>{
public String call()
{
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("这是线程 C");
return "thread C";
}
public static void main(String args[])
{
threadTest_3 c = new threadTest_3();
FutureTask<String> faeature = new FutureTask<String>(c);
new Thread(faeature).start();
System.out.println("这是主线程:begin!");
try {
System.out.println("得到的返回结果是:" + faeature.get());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("这是主线程:end!");
}
}
输出为:
这是主线程:begin!
这是线程 C
得到的返回结果是:thread C
这是主线程:end!