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