新手了解java 多线程基础知识(一)
1.基本概念
程序、进程、线程
- 程序(program)是为完成特定任务、用某种语言编写的一组指令的集 合。即指一段静态的代码,静态对象。
- 进程(process)是程序的一次执行过程,或是正在运行的一个程序。是 一个动态的过程:有它自身的产生、存在和消亡的过程——具有生命 周期。可以理解为一个正在运行的软件。
- 线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行 路径。可以理解为一个软件的功能。
多线程程序的优点:
- 提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
- 提高计算机系统CPU的利用率。
- 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理 解和修改。
2.多线程的创建
在Java中我们可以使用java.lang.Thread类来实现 ,要想我们的类具有多线程的功能,需要让我们的类去继承Thread类,然后重写run()方法,并调用 start()方法来启动多线程。
示例 1:
public class MyThread extends Thread{ public void run(){ for (int i = 0; i < 50; i++) { System.out.println("MyThread:"+i); } } } public class MyThreadTest{ public static void main(String[] args){ Thread t1 = new MyThread(); t1.start(); for (int i = 0; i < 20; i++) { System.out.println("world=====" + i); } } }
说明:创建一个Java类继承Thread类,并重写父类Thread中的run方法,在run方法中写具体的多线程业务。创建线程类的对象,并调用start方法启动多线程。
**注意:**多线程的启动调用的是start方法,在jvm底层中start方法内部会调用run方法。
一个对象只需要调用一次start()方法,如果多次调用则会抛出异常“IllegalThreadStateException”。
示例 2:
public class MyRunnable implements Runnable { public void run() { for (int i = 0; i < 50 ; i++) { System.out.println( "MyRunnable:"+i); } } } public class ThreadDemo { public static void main(String[] args) { Thread thread = new Thread( new MyRunnable()); thread.start();// 只有调用Thread类中的start()方法才可以实现多线程 for (int i = 0; i < 50; i++) { System.out.println("main:" + i); } } }
说明:
- 编写一个类,实现Runnable接口;
- 重写run()方法;
- 根据Runnable子类对象来创建Thread对象;
- 通过Thread对象调用start()方法来启动多线程;
总结:
- 继承Thread:重写run()方法,业务代码在run()中。
- 实现Runnable:线程代码存在接口的子类的run方法。
- 通过Callable和线程池的方式创建线程。
**提示:**在应用中我们如果可以使用Runable接口那么就尽量使用,这样可以避免Java单继承的局限。
3.Thread类方法介绍
1)currentThread():返回当前正在执行的线程对象的引用。
2)getName():返回当前线程的名称
3)isAlive():判断当前线程是否存活
4)isDeaomon():判断线程是否为守护线程
5)join():在当前线程中引入另一个线程,而当前线程会被阻塞
6)sleep():让当前线程进入睡眠状态
7)yield():让当前线程放弃CPU的执行权,重新进入排队,与其他线程平等争夺CPU执行。
8)interrupt() 中断线程 9)interrupted() 如果当前线程已经中断,则返回 true;否则返回 false。
示例:
public class ThreadTest { public static void main(String[] args) { //创建线程并开启线程1 Thread thread = new MyThread(); thread.start(); //创建线程并开启线程2 Thread thread1 = new Thread(new MyRunnable()); thread1.start(); //创建线程并开启线程3 MyCallable myCallable = new MyCallable(); FutureTask futureTask = new FutureTask(myCallable); new Thread(futureTask).start(); for (int i = 0; i < 100; i++) { if (i== 50){ //在main线程中当i=50加如thread线程,会在thread执行完后才会继续执行main线程剩下的 try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("main:"+i); } } } public class MyThread extends Thread{ public void run(){ for (int i = 0; i < 100; i++) { // void interrupt() 中断线程 可以理解为线程中断状态有 true | false,每一次调用就是修改状态为true //static boolean interrupted() 如果当前线程已经中断,则返回 true;否则返回 false。 Thread.currentThread().interrupt(); if (Thread.interrupted()){ System.out.println("Thread interrupted"); } // static currentThread() 返回对当前正在执行的线程对象的引用 //String getName() 返回该线程的名称。 //Thread.currentThread().getName() 获取当前线程对象的名称 System.out.println(Thread.currentThread().getName()+":"+i); } } } public class MyRunnable implements Runnable{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("MyRunnable"+i); //每次执行完打印让线程休眠1秒 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class MyCallable implements Callable { @Override public Object call() throws Exception { for (int i = 0; i < 100; i++) { System.out.println("MyCallable:"+i); } return null; } }
总结
本篇文章就到这里了,希望对你有所帮助,也希望你能够多多关注猪先飞的更多内容!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
C# WinForm多线程解决界面卡死问题的完美解决方案,使用BeginInvoke
问题描述:当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时,为了让程序执行中不出现界面卡死的现像,最好的方法就是多线程来解决一个主线程来创建界...2020-06-24java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了c# 多线程处理多个数据的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...2021-03-31
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了C#基于委托实现多线程之间操作的方法,实例分析了C#的委托机制与多线程交互操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了C#多线程中的异常处理操作,涉及C#多线程及异常的捕获、处理等相关操作技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
- 这篇文章主要介绍了C#中异步和多线程的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2021-01-16