黑马程序员--线程

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
线程的学习
线程;就是进程中独立的控制单元。
线程在控制着进程的执行。执行程序就是在执行线程。多线程就是对一个程序同时处理。
一个进程中至少有一个线程。

java VM 启动时会有一个进程Java.exe.
该进程中至少有一个线程负责Java程序的执行,而且这个线程运行的代码存在于main方法中,该线程称之为主线程。

创建线程的方式:一、继承Thread类。
步骤;1,定义类继承Thread。 
2,复写Thread类中的run方法。
目的;将自定义代码存储在run方法中,让线程运行。
3,调用线程的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) //主线程执行main方法中的代码
	{
		Demo d = new Demo();//创建一个线程但是,没有开启
		d.start();//开启线程,并执行线程的run方法
		//d.run();没有开启线程,主线程直接运行run方法。
		for (int x=0;x<60 ; x++)
		{
			System.out.println("Hello World!"+x);
		}
		
	}
}
创建线程的第二种方式:实现接口Runnable接口


步骤;
1,定义类实现Runnable接口。
2,覆盖Runnable接口中的run方法。
run方法中存放要运行的代码。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。(Thread类中有一个构造函数能接受Runnable接口类型的对象)
5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。




实现方式和继承方式的区别;
实现的好处;避免了单继承的局限性。(Java中类只能单继承)
(多线程处理同一个对象,共享同一个资源)
在定义线程时,建议使用实现方式。
class Ticket implements Runnable 
{
	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();
	}
}


黑马程序员线程练习题主要包括两个问题。第一个问题是如何控制四个线程在打印log之前能够同时开始等待1秒钟。一种解决思路是在线程的run方法中调用parseLog方法,并使用Thread.sleep方法让线程等待1秒钟。另一种解决思路是使用线程池,将线程数量固定为4个,并将每个调用parseLog方法的语句封装为一个Runnable对象,然后提交到线程池中。这样可以实现一秒钟打印4行日志,4秒钟打印16条日志的需求。 第二个问题是如何修改代码,使得几个线程调用TestDo.doSome(key, value)方法时,如果传递进去的key相等(equals比较为true),则这几个线程应互斥排队输出结果。一种解决方法是使用synchronized关键字来实现线程的互斥排队输出。通过给TestDo.doSome方法添加synchronized关键字,可以确保同一时间只有一个线程能够执行该方法,从而实现线程的互斥输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [黑马程序员——多线程10:多线程相关练习](https://blog.csdn.net/axr1985lazy/article/details/48186039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值