学习多线程,首先要先了解进程,什么是进程:进程是一个正在执行中的程序,每一个进程执行顺序,该顺序叫做执行路径,或者叫控制单元。而线程就是进程中的一个独立的控制单元,线程在控制着进程的执行,一个进程至少有一个线程。
Java VM启动的时候会有一个进程java.exe,该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中,该线程称之为主线程。jvm还有其他的线程,比如负责垃圾回收机制的线程。
1,如何在自动的代码中,自定义一个线程?
通过对API的查询,java已经提供了对线程这类事物的描述,就是Thread类,创建线程的第一种方式:
继承Thread类:
步骤:
1:定义一个类继承Thread类;
2:复写Thread类中的run方法,将自定义代码定义在run方法中,让线程执行;
3:调用Start方法,该方法有两个作用:启动线程,调用run方法;
例如:
class Demo1 extends Thread{ //继承Thread类
//重写run方法,然后在run方法中定义功能
public void run(){
for(int x=0;x<50;x++){
System.out.println("Demo1 run~"+x);
}
}
}
public class Demo {
public static void main(String[] args) {
for(int x=0;x<50;x++){
System.out.println("Start"+x);
Demo1 d=new Demo1();//创建一个线程
// d.run();//仅仅是调用方法,线程创建了,但是没有运行
d.start();//调用多线程
}
多线程的功能:
/*
* 如何获取线程对象名称
* public final String getName():获取线程名称
* 如何设置线程对象名称
* 方法一:public final void setName(String name):设置线程的名称
* 方法二:使用带参构造函数
*/
public class ThreadDemo2 {
public static void main(String[] args) {
Thread2 t1=new Thread2();
Thread2 t2=new Thread2();
//调用方法设置名称
t1.setName("哈哈");
t2.setName("一一");
t1.start();
t2.start();
Thread2 t3=new Thread2("java");
Thread2 t4=new Thread2("c");
t3.start();
t4.start();
/*
* 怎么获取main方法的线程名称
* Thread类提供了一个放法:
* public static Thread currentThread():返回当前正在执行的线程对象
* currentThread()方法返回值也是Thread类,所以能继续调用getName()方法
*/
System.out.println(Thread.currentThread().getName());
}
public class Thread2 extends Thread {
public Thread2(String name){
super(name);
}
public Thread2() {
super();
}
public void run() {
for(int x=0;x<500;x++){
System.out.println(this.getName()+"-------"+x);
}
}
}
多线程睡眠:
public class ThreadSleepDemo {
public static void main(String[] args) {
ThreadSleep ts1=new ThreadSleep("A");
ThreadSleep ts2=new ThreadSleep("B");
ThreadSleep ts3=new ThreadSleep("C");
ts1.start();
ts2.start();
ts3.start();
}
}
public class ThreadSleep extends Thread {
public ThreadSleep(String name) {
super(name);
}
public ThreadSleep() {
super();
}
public void run() {
for(int x=0;x<100;x++){
System.out.println(getName()+":"+x+"日期:"+new Date());
//开启睡眠,每个线程会等待1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
* public final void join():等待该线程终止
* 该线程执行完毕,才执行其他线程
*/
public class ThreadJoinDemo {
public static void main(String[] args) {
ThreadJoin tj1=new ThreadJoin("A");
ThreadJoin tj2=new ThreadJoin("B");
ThreadJoin tj3=new ThreadJoin("C");
tj1.start();
try {
tj1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
tj2.start();
tj3.start();
}
}
public class ThreadJoin extends Thread {
public ThreadJoin() {
super();
}
public ThreadJoin(String name) {
super(name);
}
@Override
public void run() {
for(int x=0;x<100;x++){
System.out.println(getName()+x);
}
}
}