您的位置:首页 > 其它

线程(Thread)学习1

2018-01-18 21:59 169 查看
线程是什么?
一个程序正在执行时可称作一个进程。一个进程下面有一个或多个线程来同时执行不同的任务!线程在进程中负责代码的执行,就是一个进程中的一个执行路径。
任何一个JAVA程序,JVM在运行的时候都会创建一个main线程执行mian方法中的所有代码。
那么一个JAVA程序至少有几个线程呢?答案是至少2个:一个是主线程负责mian方法的执行,另外一个就是垃圾回收器的线程,负责垃圾的回收。
那么多线程有什好处呢?
一是解决了一个进程能同时解决多个任务的问题。
二是提高了资源的利用率。(不是提高效率!!!)
多线程也有弊端:
1.增加了CPU的负担。
2.降低了一个进程中的线程执行概率。
3.会引发线程安全问题。
4.会出现死锁的现象。
那么如何创建一个多线程呢?
有一种方式是:
1.定义一个类继承Thread类。
2.重写Thread类的run方法,把自己定义线程的任务代码写在run方法中。
3.创建这个类的的对象,并且用(类变量名.start())方法开启线程而不是用(类变量名.run())方式。因为一个线程一旦开启,那么线程就会执行run方法中的代码,run方法千万不能直接调用,直接调用run方法就相当调用了一个普通的方法而已并没有开启新的线程。

线程常用的方法:
Thread(String name) 初始化线程的名字
setName(String name) 设置线程对象名
getName() 返回线程的名名字
sleep() 线程睡眠指定的毫秒数。 静态的方法, 那个线程执行了sleep方法代码那么就是那个线程睡眠。
currentThread() 返回当前的线程对象,该方法是一个静态的方法, 注意: 那个线程执行了currentThread()代码就返回那个线程 的对象。
getPriority() 返回当前线程对象的优先级 默认线程的优先级是5
setPriority(int newPriority) 设置线程的优先级 虽然设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现(最大的优先级是10 ,最小的1 , 默认是5)。

线程安全问题的解决方案:

方法一:同步代码块

同步代码块的格式:

synchronized(锁对象){
需要被同步的代码...
}

同步代码块要注意事项:
1. 任意的一个对象都可以做为锁对象。
2. 在同步代码块中调用了sleep方法并不是释放锁对象的。
3. 只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率的。
4. 多线程操作的锁对象必须是唯一共享的。否则无效。

需求: 模拟汽车站3个售票窗口同时在售100张车票 。
class SaleTicket extends Thread{
static int num = 100;//票数 非静态的成员变量,非静态的成员变量数据是在每个对象中都会维护一份数据的。
static Object o = new Object();
public SaleTicket(String name) {
super(name);
}
public void run() {
while(true){
//同步代码块
synchronized (o) {
if(num>0){
System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
num--;
}else{
System.out.println("车票出售完了..");
break;
}
}

}
}

}

public class Demo {

public static void main(String[] args) {
//创建三个线程对象,模拟三个窗口
SaleTicket thread1 = new SaleTicket("窗口1");
SaleTicket thread2 = new SaleTicket("窗口2");
SaleTicket thread3 = new SaleTicket("窗口3");
//开启线程售票
thread1.start();
thread2.start();
thread3.start();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: