今天就跟大家聊聊有关java 中多线程的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
程序、进程、线程
程序(program)是为完成特定任务、用某种语言编写的一组指令的集 合。即指一段静态的代码,静态对象。
进程(process)是程序的一次执行过程,或是正在运行的一个程序。是 一个动态的过程:有它自身的产生、存在和消亡的过程——具有生命 周期。可以理解为一个正在运行的软件。
线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行 路径。可以理解为一个软件的功能。
多线程程序的优点:
提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
提高计算机系统CPU的利用率。
改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理 解和修改。
在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单继承的局限。
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 中多线程的原理是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。