Java面向对象—多线程

多线程

1、多线程是指在一个程序中同时执行多个线程,每个线程都有自己独立的执行路径。在多线程中,程序的执行可以同时进行多个任务,从而提高系统的资源利用率和响应性能。

2、多线程的作用:多线程可以更好的利用CPU的资源

3、Java多线程的相关概念:

进程:程序是静态的概念,而进程是动态的概念。每启动一个程序时操作系统就会为其分配一独立的地址空间。 线程:而线程是进程中的一部分,进程包含多个线程在运行。 主线程:Java中如果我们没有启动线程,那么系统会给程序启动一个线程,即主线程,main方法就在主线程运行,程序都是由线程来执行的。

4、线程的状态:

  • 创建状态

  • 就绪状态

  • 运行状态

  • 阻塞状态

  • 死亡状态

5、多线程并发

Java内置支持多线程编程,多线程程序包含两条或两条以上并发运行的部分,把程序中每个这样的部分都叫作一个线程(thread);每个线程都有独立的执行路径,因此多线程是多任务处理的一种特殊形式。 只要应用程序涉及到并发,就离不开多线程编程 (比如:机票销售系统中会有多个机票代售点)

6、开发多线程的两种方式

(1)继承Thread类,并重写run()方法

(2)实现Runnable接口,并重写run()方法

7、Thread类中的方法

方法 用途 static int enumerate(Thread [ ] t) 将线程所在的线程组及其子组中所有活动的线程复制到指定数组中,返回线程的个数 final String getName() 返回线程的名称 final boolean isAlive() 如果线程是激活的,则返回 true final void setName(String name) 将线程的名称设置为由name指定的名称 final void join( ) throws InterruptedException 等待线程结束

8、继承Thread类实现多线程

package _17多线程;
​
/**继承Thread类实现多线程
 * @author Lx
 * @create 2024-03-13 15:12
 */
public class MyThread extends Thread{
    public MyThread() {
    }
    public MyThread(String name) {
        super(name);//调用父类中有一个参数的构造方法
    }
    public void run() {
        for (int i = 1; i < 1000; i++) {
            if (i%10==0) {
                try {
                    sleep(1000);
                    //Thread.sleep(1000);//sleep()是静态方法,也可以用类名调用
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(getName()+":"+i);
        }
    }
}
package _17多线程;
​
/**测试继承Thread类实现多线程
 * @author Lx
 * @create 2024-03-13 15:27
 */
public class MyThreadTest {
    public static void main(String[] args) {
        MyThread mt1=new MyThread("线程1");
        MyThread mt2=new MyThread("线程2");
​
//        mt1.run();
//        mt2.run();
        mt1.start();//start()可以启动线程,run()只是普通的运行方法
        mt2.start();//start()启动线程后,会自动执行run()方法
    }
}

9、实现Runnable接口实现多线程

package _17多线程;
​
/**实现Runnable接口实现多线程
 * @author Lx
 * @create 2024-03-13 15:36
 */
public class MyThread1 implements Runnable{
    String name;//此类继承了Object,特有属性需要自己写
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public MyThread1() {
        super();
    }
​
    public MyThread1(String name) {
        super();
        this.name = name;
    }
​
    public void run() {
        for (int i = 1; i < 1000; i++) {
            if (i%10==0){
                try {
                    //此类继承Object,实现Runnable接口
                    //需要用Thread类去调用sleep()方法
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(getName()+":"+i);
        }
    }
}
package _17多线程;
​
/**
 * @author Lx
 * @create 2024-03-13 15:48
 */
public class MyThread1Test {
    public static void main(String[] args) {
        MyThread1 m1=new MyThread1("线程1");
        MyThread1 m2=new MyThread1("线程2");
        //必须要对线程m1进行再次封装,才能用start()启动
        Thread t1=new Thread(m1);
        Thread t2=new Thread(m2);
        t1.start();
        t2.start();
    }
}

10、线程优先级

Java中的线程优先级是在Thread类中定义的常量

NORM_PRIORITY:值为5

MAX_PRIORITY:值为10

MIN_PRIORITY:值为1

缺省优先级为NORM_PRIORITY

有关优先级的方法有两个:

final void setPriority(int newp):修改线程的当前优先级

final int getPriority():返回线程的优先级

11、线程同步

有时两个或多个线程可能会试图同时访问一个资源,例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据。在此情况下,数据可能会变得不一致。为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步“

12、线程注意事项

不论是通过继承Thread,还是实现Runnable接口创建线程,它们的一个对象只能启动一次。

解决线程同步问题的方法:用synchronized来标识需要同步的代码块。

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值