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、总结



目录
相关文章
|
4月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
200 0
|
4月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
5月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
366 5
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
505 1
|
设计模式 监控 Java
Java多线程基础-11:工厂模式及代码案例之线程池(一)
本文介绍了Java并发框架中的线程池工具,特别是`java.util.concurrent`包中的`Executors`和`ThreadPoolExecutor`类。线程池通过预先创建并管理一组线程,可以提高多线程任务的效率和响应速度,减少线程创建和销毁的开销。
845 2
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
158 1
|
安全 算法 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(下)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
201 6
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(中)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
224 5
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(上)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
175 3
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
235 1

热门文章

最新文章