多线程与线程同步问题

时间:2023-01-23 18:31:37


1.线程的启动方式,是启动 start()方法,不是run()方法

如果启动run()方法的话,可以运行,那么这个程序就不是多线程了,而是单线程了。


2.实现线程的方式有两种,1.继承Tread方法 2.实现Runnable接口


多线程:多线程是一个程序中运行多个任务

多线程的目的是更好的使用CPU资源


线程常用方法:

1.取得线程名称getName()

2.取得当前线程对象currentThread()

3.判断线程是否启动isAlive()

4.线程的强行运行join()

5.线程的休眠sleep()

6.线程的礼让yield()


不管是在Java和Android开发中,线程问题或者说线程访问网络数据中出现的问题。在Java开发中,

我们通常有在购买火车票中,经常出现买车票中,出现了负数的火车票,就是因为线程不同步问题,

如:

1)同步代码块

就是在 代码块中 加入“synchronized”关键字,则此代码就是同步代码。

同步代码块的格式:

synchronized(同步对象){

同步的内容。

}

2)同步方法

除了代码块的同步,方法也是可以同步的。

同步方法的格式:

synchronized void 方法名称(){}


一下有个例子:

public class ThreadTest {
/**
* @param args
*/
public static void main(String[] args) {
carThread c = new carThread();

Thread t1 = new Thread(c, "窗口一");
Thread t2 = new Thread(c, "窗口二");
Thread t3 = new Thread(c, "窗口三");

t1.start();
t2.start();
t3.start();
}
}




class carThread implements Runnable {


private int ticket = 10;// 车票有二十张


public void run() {
while (true) {
if (ticket > 0) {
try {
// 程序一秒钟卖一张
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()
+ "卖掉一张.......");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("剩余票数为  ticket = " + (--ticket));
} else {
// 车票等于0的时候,表示车票以买完
break;
}
}
};
}



结果为:

窗口三卖掉一张.......
窗口二卖掉一张.......
剩余票数为  ticket = 8
窗口一卖掉一张.......
剩余票数为  ticket = 7
剩余票数为  ticket = 9
窗口三卖掉一张.......
窗口二卖掉一张.......
窗口一卖掉一张.......
剩余票数为  ticket = 5
剩余票数为  ticket = 6
剩余票数为  ticket = 4
窗口二卖掉一张.......
窗口一卖掉一张.......
窗口三卖掉一张.......
剩余票数为  ticket = 1
剩余票数为  ticket = 2
剩余票数为  ticket = 3
窗口二卖掉一张.......
窗口三卖掉一张.......
窗口一卖掉一张.......
剩余票数为  ticket = -1
剩余票数为  ticket = 0
剩余票数为  ticket = -2


结果就不是我们想要的,也就是线程不同步,那我们该怎么做呢,看下面

class carThread implements Runnable {


private int ticket = 10;// 车票有二十张


public void run() {
synchronized (this) {
while (true) {
if (ticket > 0) {
try {
// 程序一秒钟卖一张
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()
+ "卖掉一张.......");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("剩余票数为  ticket = " + (--ticket));
} else {
// 车票等于0的时候,表示车票以买完
break;
}
}
}

};
}


carThread类改成这样 ,我们的程序就同步了

结果为:

窗口一卖掉一张.......
剩余票数为  ticket = 9
窗口一卖掉一张.......
剩余票数为  ticket = 8
窗口一卖掉一张.......
剩余票数为  ticket = 7
窗口一卖掉一张.......
剩余票数为  ticket = 6
窗口一卖掉一张.......
剩余票数为  ticket = 5
窗口一卖掉一张.......
剩余票数为  ticket = 4
窗口一卖掉一张.......
剩余票数为  ticket = 3
窗口一卖掉一张.......
剩余票数为  ticket = 2
窗口一卖掉一张.......
剩余票数为  ticket = 1
窗口一卖掉一张.......
剩余票数为  ticket = 0