JVM允许应用程序并发执行,实现多线程一般有以下三种方法:
1、继承Thread类,重写run()方法 Thread本质上是实现了Runnable接口的一个实例,它代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start()方法,start()方法是一个本地方法,他将启动一个新的线程,并执行run()方法,通过自定义直接继承Thread类并重写run()方法就可以启动新线程并执行自己定义的run()方法,但是,调用start()方法后并不是立即执行多线程代码,而是使改线程变成可运行状态,什么时候运行多线程代码由操作系统决定。
例:
class MyThread1 extends Thread{ //创建线程类1
public void run(){
System.out.println("线程1");
}
}
class MyThread2 extends Thread{ //创建线程类2
public void run(){
System.out.println("线程2");
}
}
public class Test{
public static void main(String []args){
MyThread1 myThread1=new MyThread1();
MyThread2 myThread2=new MyThread2();
myThread1.start(); //开启线程1
myThread2.start(); //开启线程2
}
}
2、实现Runnable接口,实现run()方法
步骤:
1)定义一个类,并实现Runnable接口,实现其中的run()方法
2)创建Thread对象,用实现Runnable借口的对象作为参数实例化该Thread对象;
3)调用Thread的start()方法
class MyThread implements Runnaable{
public void run(){
System.out.println("Thread body");
}
}
public class Test{
public static void main(String args[]){
MyThread thread=new MyThread();
Thread t=new Thread(thread);
t.start();//开启线程 最后是通过Thread对象的API来控制线程的
}
}
3.实现Callable接口,重写call()方法
Callable接口与Runnable接口的功能类似,但是提供了比Runnable接口更强大的功能。
1)Callable接口在任务结束之后提供一个返回值,Runnable无法提供这个功能;
2)Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常;
3)运行Callable可以拿到一个Funture对象,Funture对象表示异步计算的结果,它提供了检查对象是否实现的方法,由于线程属于异步计算模型,因此无法从别的线程得到返回值,在这种情况下,就可以使用Funture来监视目标线程调用call()方法的情况,当调用Funture的get()方法以获取结果时,当前线程就会阻塞,直到call()方法结束返回结果。
public class CallableAndFunture{
public static class CallableTest implements Callable<String>{
public String call() throws Exception{
return "Hello World";
}
}
public static void main(String args[]){
ExecutorService threadPool = Executor.newSingleThreadExecutor();
//启动线程
Funture<String> funture=threadPool.submit(new CallableTest());
try{
System.out.println("Waitting thread to finish");
System.out.println(funture.get());//等待线程结束,并获得返回结果
}caych(Exception e){
e.printStackTrace();
}
}
}
推荐使用Runnable接口的方式,因为Thread类继承了多种方法可以被派生类使用或者重写,但是只有run()方法是必须被重写的在run()方法中实现了而这个线程的主要功能,我们一般认为,,一个类仅在taeny需要被加强或自改是才会被继承,如果没有必要重写Thread类中的其他方法,那么通过继承Thread类和实现Runnable接口的的效果相同,所以最好还是通过实现Runnable接口的方式来实现多线程。
注意:系统通过调用线程类的start()方法来启动一个线程,此时该线程处于就绪状态而非运行状态,可以随时被JVM调度执行,在调度过程中,JVM通过调用线程类的run()方法来完成实际的操作,当run()方法结束后,线程就会终止。start()方法能够异步的调用run()方法,但直接调用run()方法是同步的,直接调用run()方法无法达到多线程的目的。
相关推荐
java的多线程实现.附带案例和文字说明
java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号
NULL 博文链接:https://toknowme.iteye.com/blog/2212529
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
Java多线程实现异步调用实例。运行Main可以看到结果。main是主线程,另有A,B,C三个线程用不同的时间跑完。
java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制
java一些简单的多线程用法,适合初学者
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...
java多线程实现TCP连接UDP聊天的聊天程序
利用java技术实现多线程文件传输
java多线程实现生产者和消费者
java多线程进度条
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
用java平台利用java的多线程特点,编写进度条的现实以及当前时间的实时更新。
Java多线程实现.pdf
java多线程小程序实例 java多线程小程序实例
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。...本文档提供Java多线程编程经验,方便广大Java爱好者研究学习Java多线程
论文参考,JAVAJAVA多线程教学演示系统论文