黑马程序员——java中的多线程

------- android培训java培训、期待与您交流! ----------

1 线程的概念

          要了解线程,首先的知道进程的概念。

         进程: 是一个正在执行的程序,每一个进程都有一个执行的顺序,该顺序是一个执行路径,也可以叫一个控制单元

         线程: 就是进程中的一个独立的控制单元,是线程在控制着进程的执行,每一个进程中至少会有一个线程

        多线程: 就是在一个进程中开启多条线程。

       多线程的运行机制,就是每条线程都可以获取CPU的执行权,程序执行时,CPU在进行着快速的切换,哪个线程得到执行权,哪个线程就执行。同时线程还有一个优先级的概念

2  创建一个线程

          在java中,创建一个线程的两种方式,

         第一种:

             1  创建一个类继承Thread类

             2 复写Thread类中的run方法

             3 调用线程的start方法,这个方法有两个作用:启动线程 和调用run方法

    第二种:

         1. 创建一个类实现Runnable接口

         2. 复写Runnable接口中的run方法

class MyThread extends Thread{
    public void run(){
        
    }
}

         3. 通过Thread类建立线程对象

         4. 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数

         5. 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

Class MyThread2 implements Runnable{
    public void run(){
    
    }
}

      Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,这个存储区域就是run方法内,也就是我们要线程执行的代码

        继承与实现方式的区别:

                      因为java是单继承的,所以用实现的方式可以提高程序的扩展性

                  避免了单继承的局限性。

3.   Thread类中的其他方法

      1  currentThread  获取当前线程对象

      2  getName  获取线程的名字

      3  setName  设置线程的名字,也可以在创建线程时定义

      4  getPriority  获取线程的优先级编号   1-10  最高优先级为10,最低为1

      5  setPriority 设置线程的优先级     

public class ThreadDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//             设置线程的名字
		Thread t = new MyThread("MyThread");
		System.out.println(t.getPriority());//获取优先级
		t.setPriority(1);//设置优先级
		System.out.println(t.getPriority());
		t.start();
        new Thread(new MyThread2()).start(); 
	}

}
class MyThread extends Thread{
	public MyThread(String string) {
		super(string);
	}
	public void run(){
		for(int i=0;i<20;i++){//                      获取当前线程                                     获取线程的名字
			System.out.println("继承Thread的线程 run "+Thread.currentThread().getName()+" "+i);
		}
	}
}
class MyThread2 implements Runnable{
	@Override
	public void run() {
		for(int i=0;i<20;i++){
			System.out.println("实现Runnable的线程 run "+Thread.currentThread().getName()+" "+i);
		}
	}	
}

4.  线程的安全问题

     当存在两个或者两个以上的线程时,如果两个两个线程要操作同一个数据,就会出现安全问题,在java中用Synchronized关键字来解决多线程运行时的安全问题

用Synchronized来解决安全问题

class Ticket1 implements Runnable
{
	private int tick = 100;
	Object obj = new Object();
	public void run()
	{
		while(true)
		{	
			synchronized(obj)//new Object() 这就不是多个线程使用同一个锁
			{
				if(tick>0)
				{
					//不能抛 只能try 因为接口中的run方法没有抛出异常
					try{Thread.sleep(10);}catch(InterruptedException e){}
					System.out.println(Thread.currentThread().getName()+"..tick.."+tick--);
				}
			}			
			
		}
	}	
}
/*
 这种方法不常用 继承Thread 类,
*/
class Ticket extends Thread
{
	private int tick = 100;
	Ticket(String name)
	{
		super(name);
	}
    //run方法中存放线程要运行的代码
	public void run()
	{
		while(true)
		{
			if(tick>0)
			{
				System.out.println(this.getName()+"..tick.."+tick--);
			}
		}
	}	
}
public class ThreadSyn
{
	//主线程
	public static void main(String[] args)
	{
		Ticket1 t = new Ticket1();
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		t1.start();
		t2.start();	
  	
	}
}


      



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值