javaSE之多线程

Java多线程
*首先线程是由CPU调度的
1实现多线程的两种方法
*继承Thread类
*实现Runable接口
2线程常用的控制方法
*wait()方法使线程等待进入阻塞状态,使用notify()/notifyAll方法将其唤醒,是由对象调度的
*sleep()方法使线程进入阻塞状态,由线程调度的
*join()方法使线程进入阻塞状态,由线程调度的(调用此方法主线程将会被阻塞,直到调用此方法的线程执行完毕)
3线程互斥同步
*同步语句块实例
class Ticket implements Runnable
{
private int ticket=100;
Object lock = new Object();
public void run()
{
while(true)
{
synchronized(lock)
{
try {
Thread.sleep(200);
}catch(Exception e) {
e.printStackTrace();
}
if(ticket>0)
{
System.out.println(Thread.currentThread().getName()+
“—卖出的票”+ticket–);
}
else
{
break;
}
}
}
}

}
public class Tests {
public static void main(String[] args)
{
Ticket zhou = new Ticket();
new Thread(zhou,“线程一”).start();
new Thread(zhou,“线程二”).start();
new Thread(zhou,“线程三”).start();
new Thread(zhou,“线程四”).start();

}

}
*注意锁对象可以是任意类型的对象,但多个线程共享的锁对象必须是唯一的
因此锁对象创建代码不能放到run()方法中去,否则每个线程都会有一个不同的锁,
每个锁都有自己都标志位。线程之间便不能产生同步
*同步化方法实例
class Ticket implements Runnable
{
private int ticket=100;
Object lock = new Object();
public void run()
{
while(true)
{
SaleTicket();
if(ticket<=0)
{
break;
}
}
}
private synchronized void SaleTicket()
{
try {
Thread.sleep(500);
}catch(Exception e) {
e.printStackTrace();
}
if(ticket>0)
{
System.out.println(Thread.currentThread().getName()+
“—卖出”+ticket–);
}
}

}
public class Tests {
public static void main(String[] args)
{
Ticket zhou = new Ticket();
new Thread(zhou,“线程一”).start();
new Thread(zhou,“线程二”).start();
new Thread(zhou,“线程三”).start();
new Thread(zhou,“线程四”).start();

}

}

*yield()方法和sleep()方法的异同
同:都可以让运行的线程暂停
异:yield()方法不会阻塞线程,他只是将线程转换成就绪状态
4后台线程
*后台线程:Daemon线程,所有用Thread建立的线程都是前台线程,main就是前台线程
*前后台线程的区别:进程中只要有前台线程没退出,进程就不会终止,所有前台线程都退出哪怕还有后台线程,进程也会终止。

*主要方法:判断是不是后台线程:isDaemon();Thread类的setDaemon()来设置为后台线程

你可能感兴趣的:(javaSE之多线程)