java之多线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java之多线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7986字,纯文字阅读大概需要12分钟。
内容图文
![java之多线程](/upload/InfoBanner/zyjiaocheng/634/5ad9a54a4db841d6a971d3d6d6f3757a.jpg)
多线程
并发和并行
并发:指两个或多个事件在同一个时间段内发生。
并行:指两个或多个事件在同一时刻发生(同时发生)。
创建线程
Thread类
java.lang.Thread 类
构造方法
public Thread() :分配一个新的线程对象。
public Thread(String name) :分配一个指定名字的新的线程对象。
public Thread(Runnable target) :分配一个带有指定目标新的线程对象。
public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。
常用方法
public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
多线程的开启方式只有调用start方法开启。
public String getName() :获取当前线程名称。
public static Thread currentThread() :返回对当前正在执行的线程对象的引用。
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139552.jpg)
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139629.jpg)
1 /* 2 * 获取线程的名称: 3 * 1,使用Thread类中的getName()方法 4 * String getName() 返回该线程的名称 5 * 2,可以先获取到当前正在执行的线程。使用线程中的方法getName()获取线程的名称 6 * static Thread currentThread() 返回对当前正在执行的线程对象的引用 7 * */ 8 9 10 public class MyThread extends Thread { 11 12 @Override 13 public void run(){ 14 // 获取线程的名称 15 16 // String name = getName(); 17 // System.out.println(name); 18 19 20 // Thread t = Thread.currentThread(); 21 // System.out.println(t); 22 // 23 // String name = t.getName(); 24 // System.out.println(name); 25 26 27 // 链式编程 28 System.out.println(Thread.currentThread().getName()); 29 } 30 } 31 32 33 ------------------------------------------------------------- 34 /* 35 * 线程的名称: 36 * 主线程:main 37 * 新线程:Thread-0,Thread-1 38 * */ 39 40 public class Demo01GetThreadName { 41 public static void main(String[] args) { 42 // 创建Thread类的子类对象 43 MyThread mt = new MyThread(); 44 45 // 调用start方法,开启新线程执行run方法 46 mt.start(); 47 48 new MyThread().start(); 49 new MyThread().start(); 50 51 System.out.println(Thread.currentThread().getName()); 52 53 } 54 }代码示例
public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139552.jpg)
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139629.jpg)
1 /* 2 * public static void sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。 3 * 毫秒数结束之后,线程继续执行 4 */ 5 6 public class Demo01Sleep { 7 public static void main(String[] args) { 8 // 模拟秒表 9 for(int i =0;i<60;i++){ 10 11 System.out.println(i); 12 13 // 使用Thread类中的sleep方法让程序睡眠1秒 14 try { 15 Thread.sleep(1000); 16 } catch (InterruptedException e) { 17 e.printStackTrace(); 18 } 19 } 20 } 21 }View Code
第一种方式——创建Thread类的子类
java.long.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类
实现步骤:
1,创建一个Thread类的子类
2,在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要干的事)
3,创建Thread类的子类对象
4,调用Thread类中的方法start方法,开启新的线程,执行run方法【start方法自动去子类中找run方法执行】
void start() 使该线程开始执行;java虚拟机调用该线程的run方法。
结果是两个线程并发的运行,当前线程(main线程)和另一个线程(创建的新线程,执行其run方法)。
多次启动一个线程是非法的。特别是当前线程已经结束执行后,不能再重新启动
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139552.jpg)
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139629.jpg)
1 //1.创建一个Thread类的子类 2 public class MyThread extends Thread { 3 4 //2,在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要干的事) 5 @Override 6 public void run() { 7 for (int i = 0; i < 20; i++) { 8 System.out.println("run" + i); 9 } 10 } 11 } 12 13 14 --------------------------------------------------------------- 15 public class Demo01Thread { 16 17 public static void main(String[] args) { 18 // 3,创建Thread类的子类对象 19 MyThread my = new MyThread(); 20 21 //4,调用Thread类中的方法start方法,开启新的线程,执行run方法 22 my.start(); 23 24 //my.start();错误的,多次启动一个线程非法 25 26 for (int i = 0; i < 20; i++) { 27 System.out.println("main" + i); 28 } 29 } 30 }多线程第一种方式代码实现
注意:java程序属于抢占式调度,那个线程优先级高,那个线程就优先执行。同一个优先级就随机选一个执行
多线程的流程图解和内存图解:
第二种方式——实现Runnable接口
java.long.Runnable:Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。
java.long.Thread类的构造方法
Thread(Runnable target)分配新的 Thread 对象。
Thread(Runnable target, String name)分配新的 Thread 对象
实现步骤:
1,创建一个Runnable接口的实现类
2,在实现类中重写Runnable接口中的run方法,设置线程任务。
3,创建一个Runnable接口的实现类对象
4,创建一个Thread类对象,参数中传递Runnable接口的实现类对象
5,调用Thread类中的start方法开启新的线程执行run方法
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139552.jpg)
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139629.jpg)
1 // 1,创建一个Runnable接口的实现类 2 public class RunnableImp implements Runnable { 3 4 // 2,在实现类中重写Runnable接口中的run方法,设置线程任务。 5 @Override 6 public void run() { 7 for (int i = 0; i < 20; i++) { 8 System.out.println(Thread.currentThread().getName() + i); 9 } 10 } 11 } 12 13 14 ----------------------------------------------------------------- 15 public class Dem01Runnable { 16 public static void main(String[] args) { 17 // 3,创建一个Runnable接口的实现类对象 18 RunnableImp run = new RunnableImp(); 19 20 // 4,创建一个Thread类对象,参数中传递Runnable接口的实现类对象 21 // Thread t = new Thread(run);// 打印线程名称 22 Thread t = new Thread(new RunnableImp2());// 打印hello world 23 24 // 5,调用Thread类中的start方法开启新的线程执行run方法 25 t.start(); 26 27 for (int i = 0; i < 20; i++) { 28 System.out.println(Thread.currentThread().getName()+i); 29 } 30 } 31 }实现多线程方式二实现Runnable接口
两种方式的比较
实现Runnable接口创建多线程的好处:
1,避免了单继承的局限性:一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类。
实现了Runnable即可,还可以继承其他的类,实现其他的接口
2,增强了程序的扩展性,降低了程序的耦合性(解耦):实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
1)实现类中,重写了run方法:用来设置线程任务。
2)创建Thread类对象,调用start方法:用来开启多线程。
匿名内部类的方式实现多线程的创建
匿名内部类方法实现线程的创建
匿名:没有名字
内部类:写在其他类内部的类
匿名内部类的作用:简化代码
把子类继承父类,重写父类的方法,创建子类对象集合一步完成
把实现类实现接口,重写接口中的方法,创建实现类对象合成一步完成
匿名内部类的最终产物:子类/实现类对象,而这个类没有名字
格式:
1 new 父类/接口(){ 2 重写父类/接口中的方法 3 };
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139552.jpg)
![java之多线程 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501022139629.jpg)
1 public class Demo01InnerClassThread { 2 3 public static void main(String[] args) { 4 // 线程的父类是Thread 5 // 原来的步骤:new MyThread子类,调用start方法 6 7 new Thread(){ 8 // 重写run方法,设置线程任务 9 @Override 10 public void run(){ 11 for (int i = 0; i < 20; i++) { 12 System.out.println(Thread.currentThread().getName()+"哈哈哈"); 13 } 14 } 15 }.start(); 16 17 18 19 20 // 线程的接口Runnable 21 // Runnable r = new RunnableImp() 22 23 Runnable run = new Runnable(){ 24 @Override 25 public void run(){ 26 for (int i = 0; i < 20; i++) { 27 System.out.println(Thread.currentThread().getName()+"呜呜呜"); 28 } 29 } 30 }; 31 32 new Thread(run).start(); 33 34 35 36 // 简化接口的方式 37 new Thread(new Runnable() { 38 @Override 39 public void run() { 40 for (int i = 0; i < 20; i++) { 41 System.out.println(Thread.currentThread().getName()+"嗯嗯嗯"); 42 43 } 44 } 45 }).start(); 46 47 } 48 }匿名内部类实现多线程代码示例
---------------------------
内容总结
以上是互联网集市为您收集整理的java之多线程全部内容,希望文章能够帮你解决java之多线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。