java 实现多线程的两种方式
2017-02-06 16:35
344 查看
随着互联网越来越普及,多线程的问题越来越重要,今天我们就来介绍一下java中的多线程问题
java中实现多线程有两种方法:
1、继承Thread类;
2、实现Runnable接口。
下面来详细介绍一下这两种多线程的实现方式:
1、继承Thread类,重写run()方法
执行结果如下:
上面的代码中,直接调用的run()方法,并没有启动多线程,所以结果是顺序执行,my1.run()执行完之后在执行my2.run(),这样写这个多线程并没有任何意义。
如果想要启动多线程,应该使用start()方法启动多线程,start()方法会自动调用run()方法,新的代码如下:
运行两次,结果分别为:
第一次:
第二次:
通过start()方法启动的线程,不管my1.start()调用的run()方法是否执行完,都继续执行my2.start()方法,如果my2.start()后面还有其他的代码,同样不需要管my2.start()中的run()方法是否执行完,直接执行后面的代码。
2、实现Runnable代码
代码如下:
运行结果:
和Thread的run()方法一样,上面代码的Runnable的run()方法也是普通方法的功能,需要等到m1.run(); 方法执行完成,才能执行m2.run();方法,不能实现多线程的意义,如果想要实现多线程,需要通过Thread类的start()方法启动。
代码如下:
package com.duoxiancheng;
public class MyRunnable implements Runnable {
private String threadName ;
public MyRunnable(String tName) {
this.threadName = tName ;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(threadName);
}
}
public static void main(String[] args) {
MyRunnable m1 = new MyRunnable("线程A") ;
MyRunnable m2 = new MyRunnable("线程B") ;
Thread t1 = new Thread(m1) ;
Thread t2 = new Thread(m2) ;
t1.start();
t2.start();
}
}
运行结果如下:
java中实现多线程有两种方法:
1、继承Thread类;
2、实现Runnable接口。
下面来详细介绍一下这两种多线程的实现方式:
1、继承Thread类,重写run()方法
package com.duoxiancheng; public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("我是线程"+this.getId()); } } public static void main(String[] args) { MyThread my1 = new MyThread() ; my1.run(); MyThread my2 = new MyThread() ; my2.run(); } }
执行结果如下:
我是线程9 我是线程9 我是线程9 我是线程9 .......... 我是线程10 我是线程10 我是线程10 我是线程10 我是线程10 .........
上面的代码中,直接调用的run()方法,并没有启动多线程,所以结果是顺序执行,my1.run()执行完之后在执行my2.run(),这样写这个多线程并没有任何意义。
如果想要启动多线程,应该使用start()方法启动多线程,start()方法会自动调用run()方法,新的代码如下:
package com.duoxiancheng; public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("我是线程"+this.getId()); } } public static void main(String[] args) { MyThread my1 = new MyThread() ; my1.start(); MyThread my2 = new MyThread() ; my2.start(); } }
运行两次,结果分别为:
第一次:
........ 我是线程10 我是线程10 我是线程10 我是线程9 我是线程10 我是线程9 我是线程9 我是线程9 我是线程9 我是线程9 我是线程9
第二次:
....... 我是线程10 我是线程9 我是线程9 我是线程9 我是线程10 我是线程10 我是线程10 我是线程10 我是线程10 我是线程10 我是线程9 我是线程10 我是线程10 我是线程10
通过start()方法启动的线程,不管my1.start()调用的run()方法是否执行完,都继续执行my2.start()方法,如果my2.start()后面还有其他的代码,同样不需要管my2.start()中的run()方法是否执行完,直接执行后面的代码。
2、实现Runnable代码
代码如下:
package com.duoxiancheng; public class MyRunnable implements Runnable { private String threadName ; public MyRunnable(String tName) { this.threadName = tName ; } @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(threadName); } } public static void main(String[] args) { MyRunnable m1 = new MyRunnable("线程A") ; MyRunnable m2 = new MyRunnable("线程B") ; m1.run(); m2.run(); } }
运行结果:
....... 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程A 线程B 线程B 线程B 线程B 线程B ........
和Thread的run()方法一样,上面代码的Runnable的run()方法也是普通方法的功能,需要等到m1.run(); 方法执行完成,才能执行m2.run();方法,不能实现多线程的意义,如果想要实现多线程,需要通过Thread类的start()方法启动。
代码如下:
package com.duoxiancheng;
public class MyRunnable implements Runnable {
private String threadName ;
public MyRunnable(String tName) {
this.threadName = tName ;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(threadName);
}
}
public static void main(String[] args) {
MyRunnable m1 = new MyRunnable("线程A") ;
MyRunnable m2 = new MyRunnable("线程B") ;
Thread t1 = new Thread(m1) ;
Thread t2 = new Thread(m2) ;
t1.start();
t2.start();
}
}
运行结果如下:
线程A 线程A 线程B 线程B 线程B 线程B ........ 线程B 线程B 线程B 线程A 线程A 线程A 线程A
相关文章推荐
- java-模拟tomcat服务器
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程经典示例(吃苹果)
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- 在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决思路详解
- 浅谈C#多线程简单例子讲解
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#多线程传递参数及任务用法示例
- UDP和多线程服务器