一、进程:当前正在运行的程序,一个应用程序在内存中的执行区域
线程:进程中的一个执行控制单元,执行路径
一个进程可以有一个线程,也可以有多个线程
单线程:安全性高,但效率低
多线程:安全性低,效率高
二、多线程的实现方法:
1.在java.lang包下可以直接使用,继承Runable接口
2.线程是程序中的执行线程,Java虚拟机允许应用程序兵法地运行多个执行线程。
3.创建新线程有两种方法。一种方法是将类声明为Thread的子类,该子类重写Thread类的run方法,接下来可以分配并启动该子类的实例。
String getName():返回改线程的名称
Void setName(String name):改变线程名称,使之与参数name相同。
public class MyTread extends Thread{
public void run(){
for(int i = 0;i<100;i++){
System.out.println(getName() + i);
}
}
}
public class Thread{
public static void main(String[] args){
MyThread mt = new MyThread();
mt.start();
}
}
CPU执行程序的随机性
三、主方法是多线程的吗
主方法是单线程的,但是可以在主方法创建多线程
四、主方法的第二种实现方法
1.创建线程的另一种方法是声明实现Runable接口的类。然后实现run方法。然后可以分配该类的实例,在创建Thread时作为一个参数传递并且启动。
2.Thread(Runable r)
static Thread currentThread(): 返回当前线程对象
public class MyThread implements Runnable{
public void run(){
for(int i = 0;i<100;i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
public class Thread{
public static void main(String[] args){
MyThread mt = new MyThread();
Thread t = new Thread(mt);
t.start();
}
}
有了继承Thread还要Runable的原因是:如果继承了Thread就不能继承其他的类,此时可以使用Runable。推荐使用第二种。
例子:模拟火车站售票
分析:需要有火车票,每售出一张则数量减一
当火车票的数量小于1的时候,停止售票
使用多线程来模拟多个窗口进行售票
当火车票全部售完,仍旧开着
public class ThicketThread implements Runable{
int tickets = 100;
public void run(){
while(true){
if(tickets>0){ System.out.println(Thread.currentThread().getName() + ":" + tickets-- );
}
}
}
}
public class Threadtest{
public static void main(String[] args){
TicketThread tt = new TicketThread();
Thread t = new Thread(t);public class Thread{
public static void main(String[] args){
MyThread mt = new MyThread();
t.start();
}
}
static void sleep(long millis):当前线程睡
3.问题出现的原因:
(1)要有多个线程
(2)要被多个线程所共享的数据
(3)多个线程并发的访问共享数据
四、synchronized
1.synchronized:同步,可以修饰代码和方法,被修饰的代码块和方法一旦被某个线程访问,则直接锁住,其他的线程将无法访问
2.同步代码块
synchronized(锁对象){
}
注意:锁对象需要被所有的线程共享
同步:安全性高,效率低
非同步:效率高,安全性低
3.同步方法:使用关键字synchronized修饰的方法,一旦被一个进程访问,则整个方法全部被锁死,其他线程无法访问
注意:非静态同步方法的锁对象是this
静态同步方法的锁对象是字节码对象
(字节码对象:被所有对象共享,不管一个类有什么对象的特殊对象)
五、线程的生命周期
多线程
网友评论