黑马程序员——(九)多线程

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

 


 一、继承Thread

  1)继承Thread类
 (1)定义类继承Thread类
 (2)重写Thread类的run()方法
 (3)创建该类对象
 (4)调用start()方法即可开启新线程, 新线程会自动执行run()方法
  2)实现Runnable
 (1)定义类实现Runnable接口
 (2)实现Runnable接口的run()方法
 (3)创建自定义Runnable对象
 (4)创建Thread对象, 将Runnable对象传入Thread类的构造函数
 (5)调用start()方法即可开启新线程, 新线程会自动执行Runnable的run()方法


二、线程常用方法
  1)currentThread
    静态方法, 获取当前的线程对象
  2)getName, setName
    获取和设置线程的名字
  3)sleep
    静态方法, 控制当前线程休眠指定毫秒
  4)setDaemon
   设置指定线程为守护线程, 守护线程不会单独运行
  5)join
   当前线程暂停, 等待指定线程执行完毕后再继续
  

三、同步
  1)什么是同步
    在多线程并发访问同一资源时, 有可能出现线程安全问题,为了解决这种问题, 我们就可以使用同步技术
将多个线程访问资源的代码进行同步。

    2同步代码块

 (1)将需要同步的代码放在 synchronized(){} 代码块中, 在小括号中指定锁对象

 (2)多段使用相同锁的同步代码块, 同一时间只能执行一个, 必须等待一个执行结束后其他的才能继续执行

    3同步方法

 (1)如果整个方法内的代码都需要同步, 可以在方法前加上synchronized修饰
 (2)只有在同一个类中的几个方法可以使用同步方法的形式进行同步, 如果不同类中的几个方法想要同步, 必须使用同步代码块
 (3)因为同步方法默认使用this作为锁对象
  4)死锁
    多线程并发执行时, 如果多段同步代码嵌套使用, 有可能互相冲突产生死锁, 导致程序阻塞.在编程的过程中尽量不要将同步代码嵌套使用, 避免产生死锁。

四、通信
  1)什么是通信
   在多线程并发执行的时候, 可以使用wait()和notify()方法在多个线程间互相通信
   2)怎么使用
(1)通信的代码必须写在同步代码中, 必须使用锁对象来调用wait()和notify()
(2)wait()方法可以控制当前线程等待, 直到其他线程调用notify()或者notifyAll()方法才被唤醒

 

练习:

 

package Package;

public class ThreadDemo1 {

	public static void main(String[] args) {
		thread1 a1=new thread1("A");
		thread1 a2=new thread1("B");
		a1.start();
		a2.start();
	}
	public static class thread1 extends Thread{
		private String name;
		public thread1 (String name){
			this.name=name;
		}
		public void run() {
			for (int i = 0; i < 1000; i++) {
				System.out.println(name+":"+i);
			}
			super.run();
		}
	}

}

 

运行效果:


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑马程序员线程练习题主要包括两个问题。第一个问题是如何控制四个线程在打印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、付费专栏及课程。

余额充值