
}
}
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–);
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)