小白看了也会的多线程
世间万物都可以同时完成很多工作。例如,人体可以同时进行呼吸、血液循环、思考问题等活动。用户既可以使用计算机听歌,也可以编写文档和发送邮件,而这些活动的完成可以同时进行。这种同时执行多个操作的“思想”在 Java 中被称为并发,而将并发完成的每一件事称为线程。
一,多线程实现的方式
1,继承Thread 类
public class demo extends Thread {
@Override
public void run(){
System.out.println("当前线程"+Thread.currentThread().getName());
}
}
1.2 编写线程的主方法
public class TestDemo{
public static void main(String[] args) {
demo demo =new demo();
demo.setName("A");
demo.start();
}
}
运行看到的结果是
2,实现 Runnable 接口
public class TestRunnable implements Runnable{
@Override
public void run()
{
System.out.println("Runnable运行中!");
}
}
2.2 编写现线程主方法
public class demo4 {
public static void main(String[] args) {
Runnable runnable = new TestRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
}
查看运行结果
二, 线程的生命周期
下面对线程生命周期中的 7 种状态做说明。
出生状态:用户在创建线程时所处的状态,在用户使用该线程实例调用 start() 方法之前,线程都处于出生状态。
就绪状态:也称可执行状态,当用户调用 start() 方法之后,线程处于就绪状态。
运行状态:当线程得到系统资源后进入运行状态。
等待状态:当处于运行状态下的线程调用 Thread 类的 wait() 方法时,该线程就会进入等待状态。进入等待状态的线程必须调用 Thread 类的 notify() 方法才能被唤醒。notifyAll() 方法是将所有处于等待状态下的线程唤醒。
休眠状态:当线程调用 Thread 类中的 sleep() 方法时,则会进入休眠状态。
阻塞状态:如果一个线程在运行状态下发出输入/输出请求,该线程将进入阻塞状态,在其等待输入/输出结束时,线程进入就绪状态。对阻塞的线程来说,即使系统资源关闭,线程依然不能回到运行状态。
死亡状态:当线程的 run() 方法执行完毕,线程进入死亡状态。
三,线程之间变量的访问
3.1 变量不共享
ublic class Test1 extends Thread{
private int count = 5;
public Test1(String name){
super();
this.setName(name);
}
@Override
public void run(){
super.run();
while (count>0){
count--;
System.out.println("由 "+this.currentThread().getName()+" 计算,count="+count);
}
}
}
编写主方法
public static void main(String[] args) {
Test1 a=new Test1("A");
Test1 b=new Test1("B");
Test1 c=new Test1("C");
a.start();
b.start();
c.start();
}
运行查看为
3.2 变量共享
public class Test1 extends Thread{
private int count = 5;
@Override
public void run(){
super.run();
count--;
System.out.println("由 "+this.currentThread().getName()+" 计算,count="+count);
}
}
编写住方法
public static void main(String[] args) {
Test1 test1 = new Test1();
Thread a=new Thread(test1,"A");
Thread b=new Thread(test1,"B");
Thread c=new Thread(test1,"C");
a.start();
b.start();
c.start();
}
查看运行为
上述访问如果多个线程一起访问就出现了非线程安全问题更改代码如下
public class Test1 extends Thread{
private int count = 5;
@Override
synchronized public void run(){
super.run();
count--;
System.out.println("由 "+this.currentThread().getName()+" 计算,count="+count);
}
}
四, 线程睡眠sleep
@Override
public void run(){
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
System.out.println("当前时间为"+format+" 开始");
try {
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
Date date1 = new Date();
String format1 = simpleDateFormat.format(date1);
System.out.println("当前时间为"+format1+"结束");
}
编写主线程
public static void main(String[] args) {
Test1 t = new Test1();
t.start();
}
查看运行结果
五 线程让步 yieId()
六 线程停止 interrupt()
七 线程暂停 suspend() 与 resume() 方法