javaSE_多线程

迈不过友情╰ 2022-05-25 03:23 246阅读 0赞

线程的创建和启动:

A:继承Thread类创建线程

1.定义Thread类的子类,并重写run方法。

2.创建对象,调用start方法启动线程.

B:实现Runnable接口来创建线程

1.创建一个类实现Runnable接口,并重写run方法。

2.创建类对象,并以此实例作为Thread的target来创建Thread对象。

3.调用Thread对象的start方法启动线程。

  1. Thread

public class MyThread extends Thread{

private int _count;

public MyThread(int count){

_count = count;

}

@Override

public void run() {

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

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

}

}

}

public class UseThread {

public static void main(String[] args) {

System.out.println(“—main——start———-“);

Thread thread1 = new MyThread(22);

thread1.start();

Thread thread2 = new MyThread(19);

thread2.start();

System.out.println(“—main——finish———-“);

// thread2.interrupt();// 终止线程

}

}

输出:

--main——start———-

--main——finish———-

Thread-0 : 1

Thread-0 : 2

。。。

Thread-1 : 13

Thread-0 : 20

Thread-0 : 21

Thread-1 : 14

Thread-0 : 22

Thread-1 : 15

Thread-1 : 16

Thread-1 : 17

Thread-1 : 18

Thread-1 : 19

  1. Runnable

public class MyRunnable implements Runnable{

private Integer _ticket;

public MyRunnable(int ticket){

_ticket = ticket;

}

@Override

public void run() {

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

//synchronized (_ticket ) {

if (_ticket > 0){

System.out.println(Thread.currentThread().getName() + “ : “ + _ticket--);

}

else{

System.out.println(Thread.currentThread().getName() + “ : “ + “no ticket”);

}

}

}

}

MyRunnable run = new MyRunnable(10);

Thread thread1 = new Thread(run);

Thread thread2 = new Thread(run);

thread1.start();

thread2.start();

输出:

Thread-0 : 10

Thread-1 : 9

Thread-0 : 8

Thread-0 : 6

Thread-0 : 5

Thread-0 : 4

Thread-0 : 3

Thread-0 : 2

Thread-1 : 7

Thread-1 : 1

Thread-1 : no ticket

Thread-1 : no ticket

Thread-1 : no ticket

Thread-1 : no ticket

一共有10张票,两个线程各自循环减票,最后一起将10张票减完。可以理解为定义了一个全局对象,两个线程都访问此对象,共同消耗其成员计数。所以它并不保证各线程不会输出同一张票。

但是上面的代码要注意,如果一个线程中if(_ticket>0)执行完后,在输出之前,此时另一线程正好也执行到if语句,就会导致同时输出同一张票。

为了验证此问题,在if后面,_ticket—之前sleep(200);

if (_ticket > 0){

System.out.println(Thread.currentThread().getName() + “ : “ + _ticket);

try {

Thread.sleep(200);

} catch (InterruptedException e) {

e.printStackTrace();

}

_ticket--;

}

else{

System.out.println(Thread.currentThread().getName() + “ : “ + “no ticket”);

}

输出:

Thread-0 : 10

Thread-1 : 10

Thread-1 : 9

Thread-0 : 9

Thread-1 : 7

Thread-0 : 7

Thread-1 : 6

Thread-0 : 6

Thread-1 : 4

Thread-0 : 4

Thread-1 : 3

Thread-0 : 3

Thread-1 : 2

Thread-0 : 2

从结果来看,确实验证了上面的话,它并不保证各线程不会重复处理。

发表评论

表情:
评论列表 (有 0 条评论,246人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaSE 线(2)

    死锁 多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁. 为了避免死锁出现,最好不要同步代码块嵌套。 例子 饭桌上每个人都只有一边筷子,

    相关 JavaSE线

    写这篇文章的前提,楼主从学习java开始,自认为技术不错,反正肯费工夫学,为什么我现在又回来准备写一篇关于多线程文章,说真的,现在谁还用多线程?都是封装过的框架,根本不考虑什么

    相关 javaSE_线

    线程的创建和启动: A:继承Thread类创建线程 1.定义Thread类的子类,并重写run方法。 2.创建对象,调用start方法启动线程.   B:实现Runn

    相关 Javase线(1)

    多线程(1) 多线程的概述 了解多线程之前需要先了解线程,而线程依赖于进程而存在,所以先了解进程。 什么是进程 进程就是正在运行的程序。是系统进行资源分配和