欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java线程

程序员文章站 2022-05-04 17:10:24
...

什么是线程:线程是一个轻量级的进程,简单来说,就是一个独立的代码程序,可以独立获取时间片进行代码的运行,什么是时间片,时间片指的是吧一秒钟Cpu能运行指令的次数,我们的程序都是获取CPU时间片来执行指令,获取的时间片越多,程序指令就执行越多,越流程。
目前我们的程序都是一个线程 main线程, 所以导致我们的程序执行的时候只能一条线的方式执行。 只能进行一个代码的执行。其他代码必须根据顺序才能执行。
我们可以利用线程,吧我们的程序做成多线程,不同的线程执行不同的代码, 一起执行多个代码。

实现线程的方式有两种
1、继承自Thread类 重写run方法


public class Plane extends Thread{

    public int x = 1000;
    //重写run方法
    public void run() {

        while(true) {
            this.x--;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(this.x);
        }


    }

}

2、实现自Runnable接口。

import java.text.SimpleDateFormat;
import java.util.Date;


public class DateThread2 implements Runnable{

    public void run() {
        while(true) {

            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

            String str = sdf.format(date);
            System.out.println(str);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

此处需要注意:我们启动线程是调用start方法,而不是调用run, 而我们关闭线程API虽然提供了一个stop方法,但是不安全,不建议使用stop方法,而是在我们线程把本身run方法里面相伴结束代码块。

线程的5种状态:
新建、就绪、运行、阻塞、结束

当我们创建一个线程对象的时候,该线程就进入新建状态,当我们调用线程的start方法,线程进入就绪状态,等待CPU分配时间片运行,当获取到 CPU时间片的时候,代码开始执行,进入运行状态。当运行时候我们调用sleep、join、yeild、join,还有其他一些方式导致改程序暂停运行就进入了阻塞状态,当阻塞结束后又进入就绪状态,然后进入运行状态,程序执行完成后该线程进入结束状态,然后等到CPU回收该内存。
java线程

线程方法详解:
1、setPriority(int newPriority)设置线程优先级,我们可以通过此方法设置线程的优先级,优先级越高获取时间片的概率就越大。
2、join() join(long millis) join(long millis, int nanos) ,线程合并,合并外部的线程,然后等待外部线程执行完毕后,在执行当前线程。
3、yield方法,就是线程让行的意思,本来该我获取时间片了,但是我不获取,让给别人去获取,我在获取下一次
4、wait和notify
wait方法:
wait()和wait(timeout) 第一个是一直进入等待状态, 第二个是进入等待状态,到时间自己往下 notify 和我们的wait是组合使用:

synchronized (Account.o) {
System.out.println(“输入密码”);
if( Account.balence>=200) {
System.out.println(name + “取钱200走了”);
Account.balence -= 200;
}else {
System.out.println(name + “余额不足!没法取钱”);
}

try {
Account.o.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

while(true) {

try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (Account.o) {
Account.o.notify();
}

}
Thread本身提供了一个stop方法,但是这个方法很不安全,我们不推荐使用这个方法,因为一般的线程都是一个循环体, 所以我们通过标志位 来结束循环达到结束线程目的

 public void run() {
        while(this.live) {
            this.x-= this.speed;

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

多线程:
线程并发;所谓的线程并发就是当我们多个程序操作同一个资源的时候,会造成资源重复操作。
解决方案就是加锁,synchronized
类锁

      synchronized (Ren.class) {
            System.out.println("输入密码");
            if( Account.balence>=200) {
                System.out.println(name + "取钱200走了");
                Account.balence -= 200;
            }else {
                System.out.println(name + "余额不足!没法取钱");
            }

            System.out.println("取钱结束,余额为:" + Account.balence);

        }

线程异步:所谓的异步就是多个线程同时操作,有可能会操作到同一个资源,这样就会形成我们的资源误操作,这种方式效率高,速度快,不安全,容易资源误操作
线程同步:多个线程一起运行,但是后面的线程必须等前面的线程运行完成以后才能运行,效率低下,速度慢,安全,
所谓未来很多地方我们都需要实现线程同步!!!

  对象锁
public void run() {
        synchronized (Account.o) {
            System.out.println("输入密码");
            if( Account.balence>=200) {
                System.out.println(name + "取钱200走了");
                Account.balence -= 200;
            }else {
                System.out.println(name + "余额不足!没法取钱");
            }

            System.out.println("取钱结束,余额为:" + Account.balence);

        }
    }
  方法锁
public synchronized void run() {
            System.out.println("输入密码");
            if( Account.balence>=200) {
                System.out.println(name + "取钱200走了");
                Account.balence -= 200;
            }else {
                System.out.println(name + "余额不足!没法取钱");
            }

            System.out.println("取钱结束,余额为:" + Account.balence);
    }

处理线程并发:一种方式是加锁, 另外一种方式是队列