1、 多线程的概念:多线程是实现并发控制的一种有效手段,线程是指程序运行的流程。
多线程是指可以同时运行多个程序块,是程序运行效率更高。
2、 一个进程包含多个线程;
线程是程序中的执行线程。Java 虚拟机允许应用程序并发多个执行线程。
3、 创建新执行线程有两种方法。一种方法是将类声明为Thread 的子类。该子类应重写Thread 类的run 方法。接下来可以分配并启动该子类的实例。如,计算大于某一规定值的质数的线程可以写成。
4、 创建Thread 线程的三个步骤:
- 定义类继承 Thread;
- 覆写 Thread 类中的run() 方法。目的:将自定义代码存储在run方法中;
- 调用线程的start() 方法,该方法有两个作用,启动线程,调用run()方法。
public class Customer extends Thread{
String name;
public void run(){
for(int i=0;i<10;i++){
System.out.println(name+"\t"+i);
}
}
}
public class UseCustomer{
public static void main(String args[]){
Customer m=new Customer();
m.name="a";
Customer m1=new Customer();
m1.name="b";
m.rum();//主线线程主线线程线程
m.start();
m1.Start();
}
}
例子:窗口卖票
public class ccticket extends Thread{
String name;
static int ticket=5;//在创建线程的时候,不建议用static
public void run(){
while(ticket>0){
System.out.println(name+"卖了第"+ticket+"票");
}
}
}
public class Useccticket{
public static void main(String args[]){
ccticket c=new ccticket();
ccticket c1=new ccticket();
c.name="1号窗口";
c1.name="2号窗口";
c.start();
c2.start();
}
}
会出现bug,线程本身的问题。
5、另一种创建线程的方法,声明实现Runable 接口的类。(推荐使用)
- 定义类实现 Runable 接口;
- 覆盖 Thread 类来建立线程对象,将线程要运行的代码放入到run() 方法中;
- 通过Thread 类来建立线程对象;
- 将 Runable 接口的子类对象作为实际参数传递给Thread 类的构造函数;
- 调用 Thread 类的Start() 方法开启线程并掉哦那个Runnable 接口子类的run() 方法。
public class Ticket implements Runable{
private int ticket=1;
public void run(){
while(ticket<6){
show();
}
}
public synchronized void show(){
if(ticket<6){
try{
Thread.sleep(10);
}catch(Exception e){
System.out.println(Thread.currentThread().getName()+"卖出去了第"+ticket+"票")
}
}
}
}
public class Useticket{
public static void main(String args[]){
Ticket t=new Ticket();
new Thread(t).start();
new Thread(t).start();
}
6、 Runable 接口和Thread继承类实现多线程区别
- Runable 接口可以避免由于Java单季承的局限性,更适合多个相同程序代码的线程去处理同一资源情况,实现资源共享。
- 同步:一个多线程如果通过 Runable 接口实现,则意味着类中的属性被多个线程共享。
- 如果多个线程操作同一资源,就有可能出现资源是否同步问题。
- 在Thread 类之中可以发现有一个名为sleep(long millis) 的静态方法,此方法用于线程是休眠。(定义休眠的时间)
- 解决这样的问题,必须使用同步来解决
- 此线程完成后才可以继续进行
- 同步可以通过同步块或同步方法来完成。