Java多线程
来源:互联网 发布:如何找数据分析项目 编辑:程序博客网 时间:2024/05/22 18:05
首先要知道实现java多线程有2种方法,一个是继承Thread类重写run()方法,一个是 实现Runnable接口重写run()方法,执行这个多线程类的方法都是调用start()方法,并且第二种方法才是推荐的
方法一:继承Thread类,为了标识正在运行的是哪个线程,我给这个类起个名字name
- public class Mythread extends Thread{
- private String name = null;
- public Mythread(String name) {
- this.name = name;
- }
- @Override
- public void run() {
- for (int i = 0; i < 50; i++) {
- System.out.println("正在执行"+name+"的第"+i+"个数字");
- }
- }
- }
在main中调用这个多线程类,我们多调用几次才叫多线程调用呀(模仿实际项目中多个人访问这个方法)
- public static void main(String[] args) {
- Mythread t1 = new Mythread("A");
- Mythread t2 = new Mythread("B");
- t1.start();
- t2.start();
- }
可以发现线程交替执行
方法二:实现Runnable接口
- public class Mythread implements Runnable{
- private String name=null;
- public Mythread(String name){
- this.name = name;
- }
- @Override
- public void run() {
- for (int i = 0; i < 500; i++) {
- System.out.println("正在执行"+name+"的第"+i+"个方法");
- }
- }
- }
调用时发现这个接口并没有start()方法,但是我们查看Thread这个类发现他有个构造方法里可以传一个Runnable接口
- public Thread(Runnable r){}
也就是说Thread类是Runnable接口的实现类。因此调用代码通过Thread类来调用start()方法:
- public static void main(String[] args) {
- Mythread m1 = new Mythread("A");
- Mythread m2 = new Mythread("B");
- new Thread(m1).start();
- new Thread(m2).start();
- }
2种方法的区别和联系:
在实际中我们推荐用方法二,这因为:
1、方法一不能实现多继承(java没有多继承)
2、不能共享资源
例子:实现多个线程卖总共的5张票
用方法一 的代码如下:
- public class Mythread extends Thread{
- private int ticket = 5;
- @Override
- public void run() {
- for (int i = 0; i < 50; i++) {// 50次循环,5张票肯定是该卖完了
- if(ticket > 0 ){
- System.out.println("我卖了 票"+ticket--);
- }
- }
- }
- }
调用:
- public static void main(String[] args) {
- Mythread t1 = new Mythread();
- Mythread t2 = new Mythread();
- t1.start();
- t2.start();
- }
结果在控制台上打印了2*5=10次,也就是每张票卖了2次,这时不行的,下面我们用Runnable接口方式实现卖票:
- public class Mythread implements Runnable{
- private int ticket = 5;
- @Override
- public void run() {
- for (int i = 0; i < 50; i++) {
- if(ticket > 0 ){
- System.out.println("我卖了 票"+ticket--);
- }
- }
- }
- }
调用的时候,我们不是多次创建Mythread m = new Mythread(),然后每个执行new Thread(m).start()方法,而是只创建一次,然后多次start这同一个m
- public static void main(String[] args) {
- Mythread m = new Mythread();
- new Thread(m).start();
- new Thread(m).start();
- }
这样就实现了资源共享了
- 【Java多线程】多线程死锁
- Java 多线程
- java 多线程
- java多线程
- JAVA多线程
- java多线程
- JAVA多线程
- java多线程
- JAVA 多线程
- Java多线程
- java多线程
- JAVA 多线程
- Java 多线程
- Java 多线程
- java多线程
- Java 多线程
- Java多线程
- java 多线程
- dfs bfs模版
- 系统的横向结构和Websharp AOP(非常不错)
- html小总结:邻接选择器
- RailsCasts中文版,#14 Performing Calculations on Models 利用模型自带的统计功能
- Eclipse快捷键 10个最有用的快捷键
- Java多线程
- JM8.6中的一个重要结构体NALU_t的定义、分配和释放
- 架构师面试题1
- POJ 1326 Mileage Bank
- HOJ 1688 Speed Limit
- (4)AT&T汇编笔记
- 大端(Big Endian)、小端(Little Endian)存储模式名字的来历
- js事件驱动机制 浏览器兼容处理
- Kademlia 协议原理简介