Java多线程

来源:互联网 发布:如何找数据分析项目 编辑:程序博客网 时间:2024/05/22 18:05

首先要知道实现java多线程有2种方法,一个是继承Thread类重写run()方法,一个是 实现Runnable接口重写run()方法,执行这个多线程类的方法都是调用start()方法,并且第二种方法才是推荐的

 

方法一:继承Thread类,为了标识正在运行的是哪个线程,我给这个类起个名字name

 

Java代码  收藏代码
  1. public class Mythread extends Thread{  
  2.   
  3.     private String name = null;  
  4.       
  5.     public Mythread(String name) {  
  6.         this.name = name;  
  7.     }  
  8.       
  9.     @Override  
  10.     public void run() {  
  11.         for (int i = 0; i < 50; i++) {  
  12.             System.out.println("正在执行"+name+"的第"+i+"个数字");  
  13.         }  
  14.     }  
  15. }  

 在main中调用这个多线程类,我们多调用几次才叫多线程调用呀(模仿实际项目中多个人访问这个方法)

 

 

 

Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.     Mythread t1 = new Mythread("A");  
  3.     Mythread t2 = new Mythread("B");  
  4.     t1.start();  
  5.     t2.start();  
  6. }  
 

 

 

可以发现线程交替执行

 

 

方法二:实现Runnable接口

 

 

Java代码  收藏代码
  1. public class Mythread implements Runnable{  
  2.     private String name=null;  
  3.     public Mythread(String name){  
  4.         this.name = name;  
  5.     }  
  6.     @Override  
  7.     public void run() {  
  8.         for (int i = 0; i < 500; i++) {  
  9.             System.out.println("正在执行"+name+"的第"+i+"个方法");  
  10.         }  
  11.     }  
  12.   
  13. }  

 

 调用时发现这个接口并没有start()方法,但是我们查看Thread这个类发现他有个构造方法里可以传一个Runnable接口

 

Java代码  收藏代码
  1. public Thread(Runnable r){}  

 也就是说Thread类是Runnable接口的实现类。因此调用代码通过Thread类来调用start()方法:

 

 

 

Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.         Mythread m1 = new Mythread("A");  
  3.         Mythread m2 = new Mythread("B");  
  4.         new Thread(m1).start();  
  5.         new Thread(m2).start();  
  6. }  
 

 

 

 

2种方法的区别和联系:

在实际中我们推荐用方法二,这因为:

1、方法一不能实现多继承(java没有多继承)

2、不能共享资源

例子:实现多个线程卖总共的5张票

用方法一 的代码如下:

 

 

Java代码  收藏代码
  1. public class Mythread extends Thread{  
  2.     private int ticket =  5;  
  3.     @Override  
  4.     public void run() {  
  5.         for (int i = 0; i < 50; i++) {// 50次循环,5张票肯定是该卖完了  
  6.             if(ticket > 0 ){  
  7.                 System.out.println("我卖了 票"+ticket--);  
  8.             }  
  9.         }  
  10.     }  
  11. }  

 调用:

 

Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.         Mythread t1 = new Mythread();  
  3.         Mythread t2 = new Mythread();  
  4.         t1.start();  
  5.         t2.start();  
  6.     }  

 

 结果在控制台上打印了2*5=10次,也就是每张票卖了2次,这时不行的,下面我们用Runnable接口方式实现卖票:

 

Java代码  收藏代码
  1. public class Mythread implements Runnable{  
  2.     private int ticket =  5;  
  3.     @Override  
  4.     public void run() {  
  5.         for (int i = 0; i < 50; i++) {  
  6.             if(ticket > 0 ){  
  7.                 System.out.println("我卖了 票"+ticket--);  
  8.             }  
  9.         }  
  10.     }  
  11. }  

 

调用的时候,我们不是多次创建Mythread m = new Mythread(),然后每个执行new Thread(m).start()方法,而是只创建一次,然后多次start这同一个m

 

 

Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.         Mythread m = new Mythread();  
  3.         new Thread(m).start();  
  4.         new Thread(m).start();  
  5. }  

 这样就实现了资源共享了


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚买鹦鹉不上手怎么办 word的文件时间改了怎么办 图强gps编码丢失怎么办 武统台湾后岛民怎么办 没有你我怎么办是什么歌 ios 12软件闪退怎么办 来大姨妈想吐怎么办 3岁宝宝体重轻怎么办 硕士延期毕业考上博士怎么办 中国人移民欧洲饮食不习惯怎么办 出车祸了报警警察不管怎么办 高中的孩子不好好上学怎么办 和老公消费观念不合拍怎么办 去医院没带现金怎么办 微信读书下架了怎么办 24岁血压有点高怎么办 吃鸡鼠标弹出来怎么办 电脑分辨率调错了怎么办 猎豹sc9打不开门怎么办 苹果手机卡顿反应慢怎么办 金立手机卡顿反应慢怎么办 20天宝宝黄疸219怎么办? 智慧树选修挂科怎么办 军人被纠察抓了怎么办 我家的小孩很凶怎么办 10岁儿童老挤眼怎么办? 脚趾长鸡眼好痛怎么办 月加班超过36小时怎么办 月经老提前怎么办才好 20岁例假不规律怎么办 农村的医保门诊封顶了怎么办 保研夏令营被拒怎么办 小学生去英国游学怎么办签证 医生说我湿气重怎么办 喉咙痛有来医生感冒喉咙痛怎么办 暴马丁香叶子卷怎么办 房产权40年以后怎么办 面试回答不了考官的问题怎么办 轻伤事故对方要钱太多我怎么办 退休后有房子住公积金怎么办 江苏副高评过不聘怎么办