线程

线程

单线程:程序的执行路径只有一条路径
多线程:程序的执行路径有多条

看两个名词:
并行和并发:同时的意思
前者是逻辑上的同时,指的是在同一个时间内(时间段)同时发生
后者是物理上的同时,指的是在同一个时间点(10:30:30进行开抢:购物商城…)上同时发生

面试题:
jvm:java虚拟机是多线程的吗?
程序能够被执行:是因为里面main()方法,main()被Jvm所识别,启动Jvm,实质启动了主线程(main方法所在的就是主线程)
通过刚才这个代码:两个输出语句之间做了多次创建对象,程序依然能够执行打印出来,java语言会自动启动垃圾回收器
垃圾回收线程,所有能够保证有时候不会内存溢出

java虚拟机是一个多线程,至少开启了两个线程:
        第一个:main():主线程 Thread main
        第二个:垃圾回收线程,保证及时的回收不用的对象

如何实现多线程程序呢?
第一种方法:
java语言是不能直接调用系统功能(用系统功能创建对象),java语言可以通过C/C++底层已经调用了系统功能,java提供了一个类:
Thread类
Java 虚拟机允许应用程序并发地运行多个执行线程。’

    实现多线程程序的开发步骤:
    1:自定义一个类,该类继承自Thread类,
    2:重写该类中的run()方法
    3:主线程中去创建该类的对象
    4:启动线程.

常用方法:   
    public final String getName()返回该线程的名称。
    public final void setName(String name)改变线程名称,使之与参数 name 相同  

代码:

public class MyThread extends Thread {

public MyThread(){}
public MyThread(String name){
    super(name);
}
 @Override
public void run() {
     for(int x  =1;x<21;x++){
         System.out.println(getName()+"-"+x);
     }
}

}

public static void main(String[] args) {
//创建对象
MyThread mt1 = new MyThread(“杨虹”);
MyThread mt2 = new MyThread(“赵宇豪”);

// //给线程设置名称
// mt1.setName(“杨虹”);
// mt2.setName(“赵宇豪”);
//
//运行线程

      mt1.start();
      mt2.start();
}

结果:

杨虹-1
赵宇豪-1
杨虹-2
杨虹-3
赵宇豪-2
赵宇豪-3
杨虹-4
杨虹-5
赵宇豪-4
杨虹-6
赵宇豪-5
杨虹-7
杨虹-8
杨虹-9
赵宇豪-6
杨虹-10
杨虹-11
杨虹-12
赵宇豪-7
杨虹-13
杨虹-14
赵宇豪-8
杨虹-15
杨虹-16
赵宇豪-9
杨虹-17
杨虹-18
杨虹-19
赵宇豪-10
杨虹-20
赵宇豪-11
赵宇豪-12
赵宇豪-13
赵宇豪-14
赵宇豪-15
赵宇豪-16
赵宇豪-17
赵宇豪-18
赵宇豪-19
赵宇豪-20

常用方法:

public final void join():等待该线程终止
public static Thread currentThread():返回对当前正在执行的线程对象的引用
public static void yield():暂停当前正在执行的线程对象,并执行其他线程
    线程的执行具有随机性,并且不能保证该线程永远暂停,可能抢占到了CPU的执行权就会执行它...
public static void sleep(long millis):在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
(已过时)public final void stop():强制停止执行
public void interrupt():中断线程,中断当前线程这种状态
public final void setDaemon(boolean on):将该线程标记为守护线程或者用户线程
    true:守护线程  false:用户线程
    当正在运行的类都是守护线程时,jvm退出!该方法必须在启动线程前调用!

实现多线程第二种方式:(开发中这种比较多)
API的描述:
创建线程的另一种方法是声明实现 Runnable 接口的类,然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动

实现方式2的开发步骤:
    1)自定义一个类MyRunnable(同一个资源)实现Runnable接口
    2)然后实现Rannable里面的run方法:耗时的操作
    3)在主线程中创建MyRuhnable类的对象
    4)创建Thread类对象,将第三步的对象作为参数进行传递来启动线程

代码:

public class MyRunnable implements Runnable {

@Override
public void run() {
    for(int x = 1;x<11;x++){
        System.out.println(Thread.currentThread().getName()+"-"+x+"-"+"赵宇豪"+"我爱你");
    }

}

}

public static void main(String[] args) {
//创建对象
MyRunnable mr1 = new MyRunnable();
MyRunnable mr2 = new MyRunnable();

     //创建Thread对象
     Thread th1 = new Thread(mr1, "1");
     Thread th2 = new Thread(mr2, "2");

     //启动线程
     th1.start();
     th2.start();

}

结果:
1-1-赵宇豪我爱你
2-1-赵宇豪我爱你
1-2-赵宇豪我爱你
2-2-赵宇豪我爱你
1-3-赵宇豪我爱你
2-3-赵宇豪我爱你
1-4-赵宇豪我爱你
2-4-赵宇豪我爱你
1-5-赵宇豪我爱你
2-5-赵宇豪我爱你
1-6-赵宇豪我爱你
2-6-赵宇豪我爱你
1-7-赵宇豪我爱你
2-7-赵宇豪我爱你
1-8-赵宇豪我爱你
2-8-赵宇豪我爱你
1-9-赵宇豪我爱你
2-9-赵宇豪我爱你
1-10-赵宇豪我爱你
2-10-赵宇豪我爱你

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值