Java多线程--认识多线程(Thread、Runnable)-阿里云开发者社区

开发者社区> 吴英强> 正文

Java多线程--认识多线程(Thread、Runnable)

简介: <h1>1、进程与线程</h1> <div> <span style="white-space:pre"></span>dos系统:单进程。只能有一个程序独自运行,其他程序无法运行。</div> <div> <span style="white-space:pre"></span>windows系统:多进程。同一时间段上有多个程序同时运行。</div> <div> <img src=
+关注继续查看

1、进程与线程

dos系统:单进程。只能有一个程序独自运行,其他程序无法运行。
windows系统:多进程。同一时间段上有多个程序同时运行。



2、java的多线程实现

在java中实现多线程可以采用两种方式:
继承Thread类。
实现Runnable接口。

3、Thread类


java.lang包会在程序运行时自动导入,所以不用编写import语句。
class MyThread extends Thread{	// 继承Thread类,作为线程的实现类
	private String name ;		// 表示线程的名称
	public MyThread(String name){
		this.name = name ;		// 通过构造方法配置name属性
	}
	public void run(){	// 覆写run()方法,作为线程 的操作主体
		for(int i=0;i<10;i++){
			System.out.println(name + "运行,i = " + i) ;
		}
	}
};
以上完成了一个线程的操作类,然后直接使用此类就可以完成功能。
class MyThread extends Thread{	// 继承Thread类,作为线程的实现类
	private String name ;		// 表示线程的名称
	public MyThread(String name){
		this.name = name ;		// 通过构造方法配置name属性
	}
	public void run(){	// 覆写run()方法,作为线程 的操作主体
		for(int i=0;i<10;i++){
			System.out.println(name + "运行,i = " + i) ;
		}
	}
};
public class ThreadDemo01{
	public static void main(String args[]){
		MyThread mt1 = new MyThread("线程A ") ;	 // 实例化对象
		MyThread mt2 = new MyThread("线程B ") ;	 // 实例化对象
		mt1.run() ;	// 调用线程主体
		mt2.run() ;	// 调用线程主体
	}
};
程序的运行效果:
class MyThread extends Thread{	// 继承Thread类,作为线程的实现类
	private String name ;		// 表示线程的名称
	public MyThread(String name){
		this.name = name ;		// 通过构造方法配置name属性
	}
	public void run(){	// 覆写run()方法,作为线程 的操作主体
		for(int i=0;i<10;i++){
			System.out.println(name + "运行,i = " + i) ;
		}
	}
};
public class ThreadDemo02{
	public static void main(String args[]){
		MyThread mt1 = new MyThread("线程A ") ;	 // 实例化对象
		MyThread mt2 = new MyThread("线程B ") ;	 // 实例化对象
		mt1.start() ;	// 调用线程主体
		mt2.start() ;	// 调用线程主体
	}
};
class MyThread extends Thread{	// 继承Thread类,作为线程的实现类
	private String name ;		// 表示线程的名称
	public MyThread(String name){
		this.name = name ;		// 通过构造方法配置name属性
	}
	public void run(){	// 覆写run()方法,作为线程 的操作主体
		for(int i=0;i<10;i++){
			System.out.println(name + "运行,i = " + i) ;
		}
	}
};
public class ThreadDemo03{
	public static void main(String args[]){
		MyThread mt1 = new MyThread("线程A ") ;	 // 实例化对象
		mt1.start() ;	// 调用线程主体
		mt1.start() ;	// 错误
	}
};

4、实现Runnable接口


class MyThread implements Runnable{	// 实现Runnable接口,作为线程的实现类
	private String name ;		// 表示线程的名称
	public MyThread(String name){
		this.name = name ;		// 通过构造方法配置name属性
	}
	public void run(){	// 覆写run()方法,作为线程 的操作主体
		for(int i=0;i<10;i++){
			System.out.println(name + "运行,i = " + i) ;
		}
	}
};
class MyThread implements Runnable{	// 实现Runnable接口,作为线程的实现类
	private String name ;		// 表示线程的名称
	public MyThread(String name){
		this.name = name ;		// 通过构造方法配置name属性
	}
	public void run(){	// 覆写run()方法,作为线程 的操作主体
		for(int i=0;i<10;i++){
			System.out.println(name + "运行,i = " + i) ;
		}
	}
};
public class RunnableDemo01{
	public static void main(String args[]){
		MyThread mt1 = new MyThread("线程A ") ;	 // 实例化对象
		MyThread mt2 = new MyThread("线程B ") ;	 // 实例化对象
		
		Thread t1 = new Thread(mt1) ;		// 实例化Thread类对象
		Thread t2 = new Thread(mt2) ;		// 实例化Thread类对象
		t1.start() ;	// 启动多线程
		t2.start() ;	// 启动多线程
	}
};
运行效果:

5、Thread类与Runnable接口的联系


从定义格式上可以发现:Thread类也是Runnable接口的子类。
从类的关系上看,之前的做法非常类似于代理设计模式,Thread类完成比线程主体更多的操作。例如:分配cpu、判断是否已经启动等等。

6、Thread类与Runnable接口的区别

使用Thread类在操作多线程的时候,无法达到资源共享的母的。而使用Runnable接口实现的多线程可以实现资源共享。
class MyThread extends Thread{	// 继承Thread类,作为线程的实现类
	private int ticket = 5 ;		// 表示一共有5张票
	public void run(){	// 覆写run()方法,作为线程 的操作主体
		for(int i=0;i<100;i++){
			if(this.ticket>0){
				System.out.println("卖票:ticket = " + ticket--) ;
			}
		}
	}
};
public class ThreadDemo04{
	public static void main(String args[]){
		MyThread mt1 = new MyThread() ;	 // 实例化对象
		MyThread mt2 = new MyThread() ;	 // 实例化对象
		MyThread mt3 = new MyThread() ;	 // 实例化对象
		mt1.run() ;	// 调用线程主体
		mt2.run() ;	// 调用线程主体
		mt3.run() ;	// 调用线程主体
	}
};
三个线程各自卖各自的5张票,没有达到资源共享。
class MyThread implements Runnable{	// 继承Thread类,作为线程的实现类
	private int ticket = 5 ;		// 表示一共有5张票
	public void run(){	// 覆写run()方法,作为线程 的操作主体
		for(int i=0;i<100;i++){
			if(this.ticket>0){
				System.out.println("卖票:ticket = " + ticket--) ;
			}
		}
	}
};
public class RunnableDemo02{
	public static void main(String args[]){
		MyThread mt = new MyThread() ;	 // 实例化对象
		new Thread(mt).run() ;	// 调用线程主体
		new Thread(mt).run() ;	// 调用线程主体
		new Thread(mt).run() ;	// 调用线程主体
	}
};
虽然启动了三个线程,三个线程总共卖出了5张票。达到资源共享。

7、Thread类与Runnable接口使用结论


8、线程的状态




实际上,线程调用start()方法的时候不是立刻启动的,而是等待cpu进行调度的。

9、总结



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java多线程--认识多线程(Thread、Runnable)
<h1>1、进程与线程</h1> <div> <span style="white-space:pre"></span>dos系统:单进程。只能有一个程序独自运行,其他程序无法运行。</div> <div> <span style="white-space:pre"></span>windows系统:多进程。同一时间段上有多个程序同时运行。</div> <div> <img src=
1501 0
JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作,但是它不能返回一个值,或者抛出一个受检查的异常,有些需要返回值的需求就不能满足了。
1336 0
Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! Redis 6.0.1 于 2020 年 5 月 2 日正式发布了,如 Redis 作者 antirez 所说,这是迄今为止最“企业”化的版本,也是有史以来改动最大的一个 Redis 版本,同时也是参与开发人数最多的一个版本。
751 0
python多线程,so easy
好久没有看多线程了把基础都快忘了,今天突然想复习一下. 在很久很久以前,操作系统处理问题都是单任务的,我想做听音乐和看电影两件事儿,那么一定要先排一下顺序。
711 0
java多线程 -- ReadWriteLock 读写锁
写一条线程,读多条线程能够提升效率。 写写/读写 需要“互斥”;读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。
787 0
用Thread替代Timer——简单的多线程处理(一)
本文计划写完后你可以得到一个具有简单线程管理功能的WinForm程序,你可以学到简单的线程管理和多线程任务处理。
4837 0
如何让您的php也支持pthreads多线程
  我们常常会碰到这样一种情况,开发环境在windows下开发,而生产环境确是linux。windows下能正常运行,上传到linux后却无法好好地玩耍了。然后开始了一轮尼玛式的疯狂的查找原因,最后发现是服务器环境问题。
1076 0
Thread 线程
1.线程的状态 java的线程是通过java.lang.Thread类来实现的。 1.1创建 调用完构造函数后,线程就为创建状态。  1.2就绪 调用start()方法后,所处的状态。 1.3运行 正常的运行。 1.4阻塞 资源等待的状态。 1.5死亡 run()方法执行完毕后,该线程就死掉了。注意不能再次调用此线程的start()方法。 2.常用函数 jav
1482 0
+关注
329
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载