多线程
进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有一个线程。
Java的JVM启动的时候会有一个进程java.exe。该进程中至少一个线程负责Java程序的执行,而且这个线程运行的代码存在于main方法中,该线程称之为主线程。
创建线程方式一(继承方式)
步骤:1、定义类继承Tread。
2、复写Tread类中的run方法。目的:将自定义的代码存储在run方法,让线程运行。
3、建立子类对象(对象的同时线程也被创建),通过调用start方法开启线程。(线程的start方法能启动线程,调用run方法。Thread类中的run方法,用于存储线程要运行的代码。)
class Demo extends Thread
{
public void run()
{
for(int x=0; x<60; x++)
System.out.println("demo run----"+x);
}
}
class ThreadDemo
{
public static void main(String[] args)
{
Demo d = new Demo();//创建好一个线程。
d.start();//开启线程并执行该线程的run方法。
//d.run();//仅仅是对象调用方法。而线程创建了,并没有运行。
}
}
创建线程方式二(实现Runnable接口)
步骤:1、定义类实现Runnable接口;
2、覆盖Runnable接口中的run方法;将线程要运行的代码存放在该运行run方法中。
3、通过Thread类建立线程对象;
4、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
5、调用Thread类的start方法开启线程并调用Runnable接口子类的Run方法。
class Ticket implements Runnable//extends Thread
{
private int tick = 100;
public void run()
{
while(true)
{
if(tick>0)
{
System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);//创建了一个线程;
Thread t2 = new Thread(t);//创建了一个线程;
Thread t3 = new Thread(t);//创建了一个线程;
Thread t4 = new Thread(t);//创建了一个线程;
t1.start();
t2.start();
t3.start();
t4.start();
}
}
实现方式和继承方式有什么区别?
继承Thread:线程代码存放在Thread子类run方法中;
实现Runnable:线程代码存放在接口的子类的run方法中。避免了单继承的局限性。
同步代码块
synchronized(对象)
{
需要被同步的代码;
}
同步的前提:
1、必须要有两个或者两个以上的线程。
2、必须是多个线程使用同一个锁。
class Ticket implements Runnable //extends Thread
{
private static int tick =100;
Object obj=new Object();
public void run()
{
while(true)
{
synchronized(obj)
{
if(tick>0)
{
try{Thread.sleep(10);}
catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
}
}
}
}
}
class TicketDemo2
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
同步函数使用的锁是this
静态的同步方法,使用的锁是该方法所在类的字节码文件对象: 类名.class
class Ticket implements Runnable
{
private static int tick=100;
//Object obj=new Object();
boolean flag=true;
public void run()
{
if(flag)
{
while(true)
{
//synchronized(obj)
//synchronized(this)
synchronized(Ticket.class)
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"...sale:"+tick--);
}
}
}
}
else
while(true)
show();
}
public static synchronized void show()
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"...code...:"+tick--);
}
}
}
class StaticMethodDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
try{Thread.sleep(10);}catch(Exception e){}
t.flag=false;
t2.start();
}
}
|
|