Java多线程

Java多线程,第1张

}

}

class WashThread extends Thread {//定义洗杯子的线程

@Override

public void run(){

try {

for(int i=1;i<=5;i++){//这里洗五个杯子

System.out.println(“开始洗第”+i+“个杯子”);

Thread.sleep(1500);

System.out.println(“第”+i+“个杯子洗完了”);

}

} catch (Exception e) {

// TODO: handle exception

}

}

}

public class MakeTea {

public static void main(String[] args) {

new BoilThread().start();//在主函数中执行线程

new WashThread().start();

}

}

现在大家对 线程 是不是有了更深一点的认识呢?

[](()2.2 Java线程(Thread类)的常用用法

下面介绍一下常用的用法

线程名字可以通过 t.setName() 来设置

优先级可以通过 t.setPriority() 括号里传入1~10的整数即可

延时 *** 作 可以通过 t.sleep() 括号传入整数,单位是毫秒

线程开始 可以同过 t.start(),结束是 t.stop() 等等

在Java 中实现线程,可以直接继承 Thread 类,然后再重写 run 方法,run方法本身不执行任何 *** 作,但是重写之后,我们再执行,就会直接运行run 方法中的内容(详见上面的泡茶 示例)

[](()2.2.1 Thread 的示例

Thread 类直接继承即可,在其中的方法都是静态方法,所以可以直接调用使用

public class Test {

public static void main(String[] args) {

// TODO Auto-generated method stub

Thread t=Thread.currentThread();//获取当前运行的线程

t.setName(“t1”);//给当前线程设置为另一个名字,否则默认为main

System.out.println(“当前的线程:”+t);

try {

for (int i = 0; i < 5; i++) {//线程的运行实例

System.out.println(“i:”+i);

Thread.sleep(1000);

}

} catch (Exception e) {

// TODO: handle exception

}

}

}

运行的第一行结果如下

方括号中的第一个为我们自定义的姓名,5为这个线程的优先级(优先级是从1~10,5为默认的值),第三个是线程学名。

[](()关于 sleep 与 yield 的解释

这两者都是 Thread 的静态方法,它们的功能都是使当前运行的线程放弃 C 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 PU,但是还是有一些细微的差别

  • sleep 给其他线程运行机会,但不考虑其他线程的优先级,而 yield 不会把运行线程的机会留给优先级比自己低的进程

  • 线程执行了sleep 就进入了阻塞状态,执行了yield 就进入了就绪状态( *** 作系统里面有对进程的详细讲解)

  • 还有 sleep 在使用的时候 可能会抛出异常,所以需要 补获异常,yield 是没有这个过程的

所以一般情况还是使用 sleep 的情况比较多

[](()2.3 Java线程(Runnable)的常用用法

在 Runnable 中只有 一个 public void run() 的抽象方法

实现 Runnable 接口并在 run() 中实现相对应的方法即可实现线程

Runnable 解决了多继承的问题

这里是把上面的 Thread 实现的代码 用 Runable重新实现了一遍

class MyThread implements Runnable{//实现接口

@Override

public void run() {//重写方法体

// TODO Auto-generated method stub

String strName=Thread.currentThread().getName();

try {

for (int i = 1; i < 11; i++) {

System.out.println(“当前线程的名字是:”+strName+" "+i);

}

} catch (Exception e) {

// TODO: handle exception

}

}

}

public class ThreadTest {

public static void main(String[] args) {

Thread t1=new Thread(new MyThread());

t1.setName(“t1”);//给线程1 设置 名称

Thread t2=new Thread(new MyThread());

t2.setName(“t2”);

t1.setPriority(8);//给线程1设置优先级

t2.setPriority(6);

System.out.println(“t1优先级:”+t1.getPriority());

System.out.println(“t2优先级:”+t2.getPriority());

t1.start();//开始线程

t2.start();

}

}

运行结果:

这里的线程执行的次数比较少,所以优先级显示的不是那么明显,改成 运行 50次就可以很快看出来啦

下面是一个实际问题,某电影院有的热映电影还剩 100张票,现在有3个窗口,要同步售票,把票给卖出去(这就是一个比较简单的多线程问题)

这里我们需要两个类来完成

public class SellTicket implements Runnable {

private int ticketCount=100;//定义票为100张电影票

//增加锁对象

private Object obj = new Object();

@Override

public void run() {

// TODO Auto-generated method stub

while(true){

synchronized (obj) {//使用同步锁可以避免出现负数的情况

try {

if(ticketCount>0){

Thread.sleep(100);//睡眠0.1秒

System.out.println(Thread.currentThread().getName()+“正在卖票:”+ticketCount–);

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/872140.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存