专栏首页来自GitOPEN的技术文摘《Monkey Java》课程8.0之线程

《Monkey Java》课程8.0之线程

本节课程将学习以下内容:

  • 进程和线程的关系
  • 多线程程序运行模式
  • 定义线程的方法
  • 控制线程的常用函数
  • 多线程的数据安全
  • 同步线程的方法
  • 深入synchronized关键字

进程和线程的关系

多进程:

在操作系统中能(同时)运行多个任务(程序)。

多线程:

在同一个应用程序中有多个顺序流(同时)进行。

多线程程序运行模式

线程的执行过程:

定义线程的方法

方法1:

定义一个线程类,它继承类Thread并重写其中的方法run(),方法run()称为线程体;

方法2:

提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体。

例子1:

1.新建一个FirstThread.java的源文件:

class FirstThread extends Thread {
	public void run(){
		for (int i = 0; i < 100; i++) {
			System.out.println("FirstThread-->" + i);
		}
	}
}

2.新建一个Demo01.java的源文件:

class Demo01 {
	public static void main(String[] args) {
		// 生成线程类的对象
		FirstThread thread01 = new FirstThread();
		// 启动线程
		thread01.start();

		for (int i = 0; i < 100; i++) {
			System.out.println("main-->" + i);
		}
	}
}

3.新建一个RunnableImpl.java的源文件:

class RunnableImpl implements Runnable {
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("Runnable-->" + i);
		}
	}
}

4.新建一个Demo02.java的源文件:

class Demo02 {
	public static void main(String[] args) {
		// 生成一个Runnable接口实现类的对象
		RunnableImpl ri = new RunnableImpl();
		// 生成一个Thread对象,并将Runnable接口实现类的对象作为参数传递进去
		Thread t = new Threadj(ri);
		t.start();

		// 打印当前线程的优先级
		// 默认优先级是5,最大优先级是10,最小优先级是1。
		// 线程的优先级越高,它执行的概率就越大。
		System.out.println(t.getPriority());

		t.setPriority(Thread.MAX_PRIORITY);

	}
}

控制线程的常用函数

中断线程:

Thread.sleep(2000);线程睡眠2000毫秒。 Thread.yield();线程自动让出cpu。

设置线程的优先级:

getPriority(); setPriority();

多线程的数据安全

同步线程的方法

  • 多线程共用同一份数据的时候,会出现某种错误;
  • 因此需要在同步线程。

例子2:

1.新建一个MyThread.java的源文件:

class MyThread implements Runnable {
	int i = 100;
	public void run(){
		while (true) {
			// 同步代码块
			// 解决多线程共用同一份数据时出现错误的问题
			synchronized (this) {
				System.out.println(Thread.currentThread().getName() + i);
				i--;
				Thread.yield();
				if (i < 0) {
					break;
				}
			}
		}
	}
}

2.新建一个Demo03.java的源文件:

class Demo03 {
	public static void main(String[] args) {
		MyThread myThread = new MyThread();

		// 生成两个Thread对象,但是这两个对象共用同一个线程体
		Thread t1 = new Thread(myThread);
		Thread t2 = new Thread(myThread);

		// 每一个线程都有名字,可以通过Thread对象的setName()方法设置
		t1.setName("线程a");
		t2.setName("线程b");

		// 分别启动两个线程
		t1.start();
		t2.start();
	}
}

深入synchronized关键字

同步锁,它锁住的是对象。 如果一个线程获得了一个对象的同步锁,那么这个对象上面的所有的其它的同步代码都是不能够被其它线程执行的,都需要等待同步锁被释放后,才能够进行。

例子3:

1.新建一个名为Service.java的源文件:

class Service {
	public voi fun1 () {
		synchronized (this) {
			try {
				Thread.sleep(3000);
			} catch (Exception e) {
				System.out.println(e);
			}
			System.out.println("fun1");
		}
	}

	// fun2是一个同步方法,和fun1中的同步代码块功能一样
	public synchronized voi fun2 () {
			System.out.println("fun2");
	}
}

2.新建一个名为MyThread1.java的源文件:

class MyThread1 implements Runnable {
	private Service service;

	public MyThread1 (Service service) {
		this.service = service;
	}

	public void run () {
		service.fun1();
	}

}

3.新建一个名为MyThread2.java的源文件:

class MyThread2 implements Runnable {
	private Service service;

	public MyThread2 (Service service) {
		this.service = service;
	}

	public void run () {
		service.fun2();
	}

}

4.新建一个名为Demo04.java的源文件:

class Demo04 {
	public static void main(String[] args) {
		Service service = new Service();

		Thread t1 = new Thread(new MyThread1(service));
		Thread t2 = new Thread(new MyThread2(service));

		t1.start();
		t2.start();
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自定义Toolbar添加双击事件

    今天在播放器中,突然想到了如果列表项过多,那么用户手指连续滑着回到顶部未免太累!类似微信朋友圈的双击TitleBar返回顶部,既然微信这超级App都实现了,那还...

    GitOPEN
  • 编译Android5.1.1源码

    编译Android源码是为了更好的学习源码,当然,如果要做第三方ROM适配,也可以尝试;我们这篇重点学习如下内容:

    GitOPEN
  • 《Monkey Android》第2课之环境搭建

    SDK,中文名字就是软件开发工具包,外语全称是Software Development Kit。

    GitOPEN
  • 并发编程之ReentrantLock

    一、简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”。 ReentrantLock通过自定义队列同步器(AQS-Abstr...

    lyb-geek
  • 线程的同步

    比如买票,有窗口和柜台,窗口卖票和售票机卖票都会减少票的数量,一共100张票,通过窗口这个方法卖了70张票,售票机

    用户2965768
  • 线程基础知识归纳

    初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 运行(RUNNABLE):处于可运行状态的线程正在JVM中执行,但它可能正在等待来自操...

    Dream城堡
  • Thread.sleep() 和 Thread.yield() 区别Thread.sleep() 和 Thread.yield() 区别

    一个会写诗的程序员
  • 万字长文,Thread 类源码解析!

    金九银十,很多小伙伴都打算跳槽。而多线程是面试必问的,给大家分享下 Thread 源码解析,也算是我自己的笔记整理、思维复盘。学习的同时,顺便留下点什么~

    一个优秀的废人
  • jenkins热部署项目到tomcat全过程

    配置线上的Tomcat服务器: 在conf文件夹的tomcat-users.xml文件中添加如下代码,给Tomcat配置用户名和密码,热部署必须要有用户名和...

    似水的流年
  • jenkins热部署项目到tomcat全过程

    似水的流年

扫码关注云+社区

领取腾讯云代金券