线程
*java实现多线程的方式一:通过继承java.lang.Thread类(线程 是程序中的执行线程)来实现
*实现步骤:
*1.编写一个类继承Thread
*2.重写Thread类中的run方法
*3.使用start()方法启动线程
*注意:不要直接调用run()方法
缺点:
* 1.应为java的继承为单继承,一旦使用继承的方式将无法在继承其他的类
* 2.如果要启动多个线程,需要创建多个对象,无法完成数据共享。
* SellTicket sellTicket = new SellTicket();
sellTicket.start();
SellTicket sellTicket2 = new SellTicket();
sellTicket2.start();
*实现多线程的第二种方式:通过实现java.lang.Runnable接口 推荐***
*实现步骤:
*1.编写一个类实现Runnable接口
*2.重写run方法
*3.创建对象调用start()方法启动线程
*Thread(Runnable target) 分配新的 Thread 对象
优点:1.在java中一个类是可以实现多个接口的,可以避免java单继承带来的影响。
2.可以创建一个对象,多个代理来启动线程,可以完成对象中的数据共享。
* SellTicket2 sellTicket = new SellTicket2();
* Thread thread = new Thread(sellTicket);
thread.start();
Thread thread2 = new Thread(sellTicket);
thread2.start();
*线程的状态:
* 1.新生状态 :当使用new关键字创建线程后,在内存中分配空间
* 2.就绪状态 : 当调用start()方法启动动线程时,此时CPU未分配时间片
* 3.运行状态 : 当系统为该线程分配CPU资源(时间片)
* 4.阻塞状态 : sleep方法,join方法,IO设备等待用户输入(input.next())
* sleep():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),对所操作的对象资源进锁。
* yield():暂停当前正在执行的线程对象,并执行其他线程,对所操作的对象资源不会加锁。
* join(): 等待该线程终止。当前线程执行结束,其他线程才能执行
* 5.死亡状态: 当线程正常运行结束或出现异常。
*java.lang.Thread类:线程 是程序中的执行线程
*构造函数:
* Thread():分配新的 Thread 对象。
* Thread(Runnable target):分配新的 Thread 对象。
* Thread(String name): 分配新的 Thread 对象。默认名称:thread-xx
* 常用的方法:
* getName()返回该线程的名称。
* setName(String name):设置线程名称
* getPriority() 返回线程的优先级。线程优先级[1,10] MAX_PRIORITY:10, MIN_PRIORITY:1, NORM_PRIORITY:5(默认)
* setPriority(int p):设置线程的优先级
* isAlive() 测试线程是否处于活动状态。 如果线程处于活动状态返回true,否则返回false
* currentThread():返回对当前正在执行的线程对象的引用。
*同步(类似于排队的概念):
* 优点:安全 缺点:效率低
*加锁:
*同步代码块:对obj对象进行加锁,其他线程只有等待当前线程释放锁之后才能进行操作该对象及其属性。
*synchronized(obj){
*}
*obj:同步监视器,一般推荐使用共享资源作为同步监视器,同步监视器应该为引用类型的对象,不能是基本数据类型
*同步方法(方法的同步):synchronized修饰方法
*同步方法中不需要使用同步监视器,应为同步方法本身的同步监视器为this
*
*同步监视器和同步方法的区别:
*同步监视器对所有对象都起作用,同步方法只能针对当前对象本身起作用。
public class TicketThread2 implements Runnable {
private int ticket=50;
@Override
public void run() {
for(int i=0;i<1000;i++){
sale();
}
}
/**
* synchronized修饰的方法:方法的同步
*/
public synchronized void sale(){
if(ticket>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"---->"+(ticket--));
}
}
public static void main(String[] args) {
TicketThread2 thread = new TicketThread2();
Thread t1 = new Thread(thread);
Thread t2 = new Thread(thread);
Thread t3 = new Thread(thread);
Thread t4 = new Thread(thread);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
*/