新手了解java 多线程基础知识(一)

网友投稿 280 2022-12-30

新手了解java 多线程基础知识(一)

目录1.基本概念2.多线程的创建3.Thread类方法介绍总结

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 | BEbvofalse,每一次调用就是修改状态为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) {

BEbvo e.printStackTrace();

}

}

}

}

public class MyCallable implements Callable {

@Override

public Object call() throws Exception {

for (int i = 0; http://i < 100; i++) {

System.out.println("MyCallable:"+i);

}

return null;

}

}

总结

本篇文章就到这里了,希望对你有所帮助,也希望你能够多多关注我们的更多内容!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中Exception和Error的区别详解
下一篇:MyBatis下SQL注入攻击的3种方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~