【JAVA】Java--多线程

线程基础
线程,程序运行的基本单元。操作系统中运行的任何程序都至少有一个主线程作为这个程序运行的入口点。

进程与线程

操作系统中可以有多个进程,包括系统进程和用户进程,一个进程可以有一个或多个线程。

进程之间不共享内存,在各自独立的内存空间中运行。一个进程中的线程可以共享系统分派给这个进程的内存空间。

线程不仅可以共享进程内存,还拥有一个属于自己的内存空间--线程栈,在建立线程时由系统分配,主要用来保存线程内部所使用的数据。

操作系统将进程分成多个线程后,这些线程在操作系统的管理下并发执行,提高了程序的运行效率。

线程的执行从宏观上看,是多个线程同时执行,实际上是交替执行的。

线程的意义

1、充分利用CPU资源;

2、简化编程模型

3、简化异步事件的处理

4、使GUI更有效率

5、提高程序的执行效率(增加CPU数、为一个程序启动多个进程、在程序中使用多线程)

Java的线程模型

一个线程类的唯一标准就是这个类是否实现Runnable接口的run()方法--线程执行函数。

Java中建立线程的两种方法:

一是继承Thread类;二是实现Runnable接口,并通过Thread和实现Runnable的类来建立线程。

本质上是一种方法,都是通过Thread类建立线程,并运行run()方法。

区别在于:通过继承Thread类建立线程,虽说实现容易,但Java不支持多继承,继承了Thread类,就不能继承其他类。

通过实现Runnable接口的方法建立线程,这样线程类在必要的时候继承和业务有关的类,而不是Thread类。

创建线程
Java语言中使用类Thread代表线程,所有线程对象都必须是Thread类或其子类的实例。

无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或其子类的实例。

子类中必须要覆盖Thread类的run()方法才能真正运行线程的代码。

public class Thread1 extends Thread{
public void run()
{
System.out.println(this.getName());
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
Thread1 thread1=new Thread1();
Thread1 thread2=new Thread1();
thread1.start();
thread2.start();
}

}

注意:任何一个Java程序都必须有一个主线程,一般主线程名字是main。必须在程序中建立另外的线程,才是真正的多线程程序。

设置线程名:一是利用重载构造方法设置线程名;二是利用Thread类的setName方法修改线程名。

public class Thread2 extends Thread{
private String who;
public void run()
{
System.out.println(who+":"+this.getName());
}
public Thread2(String who)
{
super();
this.who=who;
}
public Thread2(String who,String name)
{
super(name);
this.who=who;
}
public static void main(String[] args) {
Thread2 thread1=new Thread2("thread1","MyThread1");
Thread2 thread2=new Thread2("thread2");
Thread2 thread3=new Thread2("thread3");
thread2.setName("MyThread2");
thread3.start();
thread2.start();
thread1.start();
}

}

使用Runnable接口创建线程

在实现Runnable接口的类时,必须使用类Thread的实例才能创建线程。

使用Runnable接口创建线程的过程分为如下两个步骤:

1、将实现Runnable接口的类实例化;

2、建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法,最后通过Thread类的start()方法建立线程。

public class myRunnable implements Runnable{
public void run()
{
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
myRunnable t1=new myRunnable();
myRunnable t2=new myRunnable();
Thread thread1=new Thread(t1,"MyThread1");
Thread thread2=new Thread(t2);
thread2.setName("MyThread2");
thread1.start();
thread2.start();
}

}

例:使用Thread创建线程

//通过继承Thread类来创建线程类
public class youngThread extends Thread{
private int i;
//重写run()方法,run()方法的方法体就是线程执行体
public void run()
{
for(;i<100;i++)
{
//当线程类继承Thread类时,可以直接调用getName()方法来返回当前线程的名
//如果想获取当前线程,直接使用this即可
//Thread对象的getName()返回当前线程的名字
System.out.println(getName()+""+i);
}
}
public static void main(String[] args) {
for(int i=0;i<100;i++) {
//调用Thread的currentThread方法获取当前线程
System.out.println(Thread.currentThread().getName()+""+i);
    if(i==20) {
    //创建、并启动第一条线程
    new youngThread().start();
    //创建、并启动第二条线程
    new youngThread().start();
    }
    }
}
}

在实例中直接创建的Thread子类即可代表线程对象,在使用Runnable接口创建线程中创建的Runnable对象只能作为线程对象的target。
--------------------- 
作者:学_然后时习之 
来源:CSDN 
原文:https://blog.csdn.net/qq_40722284/article/details/79681099 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_25955641/article/details/89790708