[1] 创建多线程的两种方式

  1.1 通过继承Thread类创建多线程

    1.定义Thread类的子类,重写run()方法,在run()方法体中编写子线程要执行的功能。

    2.创建子线程的实例对象,相当于新建了一条子线程。

    3.调用子线程的start()方法,子线程启动并执行run()方法中的功能。

  1.2 通过实现Runnable接口创建多线程

    1.定义一个类,实现Runnable接口,重写run()方法,在run()方法体中编写子线程要执行的功能。

    2.创建实现类的对象。

    3.调用Thread类的有参构造函数,将上述实现类对象作为形参传入,创建Thread类的对象。该对象相当于一条新线程。

    4.调用Thread对象的start()方法,子线程启动并执行run()方法中的功能。

[2] 线程同步机制

  当多条线程操作共享数据时,会出现线程安全问题。为了解决这一问题,需要保证不同线程在访问同一数据时保持一定的顺序,即“线程的同步机制”。实现该机制有两种方法:同步代码块,同步方法。前者可以指定任意对象作为监视器,后者只能默认使用当前对象作为监视器。故使用同步方法保证线程同步有一定的局限性。

[3] 代码实例

  3.1 通过继承Thread类创建多线程,并使用同步代码块的方式保证线程的同步。

 //通过继承Thread类的方式创建多线程
//多条线程操作同一个共享资源,存在线程安全问题
//通过同步代码块的方式使线程同步
package pack01; //定义子线程
class SubThread extends Thread { private static int i = 1;
static Object lock = new Object(); //创建静态对象作为监视器 // 子线程要实现的功能:将静态变量i累加到100,并打印每次的累加结果
// 由于多条线程会同时操作静态变量i,故需要保证线程的同步
public void run() { while (true) { synchronized (lock) {
if (i <= 100) {
System.out.println(Thread.currentThread().getName() + "----" + i);
++i; } else {
break;
}
}
} }
} public class MulThread {
public static void main(String[] args) { SubThread st1 = new SubThread();
SubThread st2 = new SubThread(); // 设置线程名称
st1.setName("ONE####");
st2.setName("TWO...."); // 启动线程
st1.start();
st2.start();
}
}

  3.2 通过实现Runnable接口创建多线程,使用同步方法保证线程同步。

 //通过实现Runnable接口的方式创建多线程
//多条线程操作同一个共享资源,存在线程安全问题
//通过使用同步方法保证线程的同步
package pack01; class Sub implements Runnable{ private static int i=1; //被多条线程共同操作的静态变量 public void run() {
while(true) {
printI();
}
} public synchronized void printI() { //将要需要同步的代码封装进一个同步方法中 if(i<=100) {
System.out.println( Thread.currentThread().getName() + "----" + i );
++i;
} else {
System.exit(0);
}
}
} public class MulThread2 {
public static void main(String[] args) { Sub sub = new Sub(); Thread t1 = new Thread(sub);//将Runnable接口的实现类对象作为参数,传给Thread构造器
Thread t2 = new Thread(sub); t1.setName("ONE####");
t2.setName("TWO...."); t1.start();
t2.start();
}
}

注:希望与各位读者相互交流,共同学习进步。

Java分享笔记:创建多线程 & 线程同步机制的更多相关文章

  1. Java并发编程:Java中的锁和线程同步机制

    锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...

  2. JAVA基础知识之多线程——线程同步

    线程安全问题 多个线程同时访问同一资源的时候有可能会出现信息不一致的情况,这是线程安全问题,下面是一个例子, Account.class , 定义一个Account模型 package threads ...

  3. Java多线程编程(4)--线程同步机制

    一.锁 1.锁的概念   线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题.锁 ...

  4. Java多线程 | 02 | 线程同步机制

    同步机制简介 ​ 线程同步机制是一套用于协调线程之间的数据访问的机制.该机制可以保障线程安全.Java平台提供的线程同步机制包括: 锁,volatile关键字,final关键字,static关键字,以 ...

  5. Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁

    相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...

  6. Java多线程的同步机制(synchronized)

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

  7. 【总结】Java线程同步机制深刻阐述

    原文:http://hxraid.iteye.com/blog/667437 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread ...

  8. Java基础 继承的方式创建多线程 / 线程模拟模拟火车站开启三个窗口售票

    继承的方式创建多线程 笔记: /**继承的方式创建多线程 * 线程的创建方法: * 1.创建一个继承于Thread 的子类 * 2.重写Thread类的run()方法 ,方法内实现此子线程 要完成的功 ...

  9. linux学习笔记之线程同步机制

    一.基础知识. 1:线程同步机制:互斥量,读写锁,条件变量,自旋锁,屏障. 1,互斥量:每个进程访问被互斥量保护的资源时,都需要先对互斥量进行判断. 1)互斥量重要属性:进程共享属性,健壮属性,类型属 ...

随机推荐

  1. 自适应布局下echarts引起页面跳帧

    项目上突然遇到一个问题,鼠标快速滑动有echarts画的饼图时,页面出现了跳帧.布局的高度突然发生变化然后恢复正常.高度怎么会变化呢?都是按百分比来的啊? 经过一番仔细观察,在跳帧的时候页面底部闪过了 ...

  2. 【2015 Week Task】

    2015 第17周 task:项目语音识别技术整理 2015 第18周 task:项目key技术整理

  3. android 5.0 下载编译

    CM的CM-12.0版本(对应Android5.0.2): $ repo init -u https://github.com/CyanogenMod/android.git -b cm-12.0 注 ...

  4. Windows怎样共享文件夹给Virtualbox 里面的Ubuntu

    主要命令 1.  sudo mount -t vboxsf Share /media/sf_Share 2.   sudo adduser userid vboxsf

  5. jdbc、Connection pool、jndi的理解和关系

    一.概念和理解: ①.jdbc:Java Data Base Connectivity,java数据库连接,最为传统的一种方式,直接连接操作数据库,需要连接时创建连接,使用结束时销毁连接. ②.Con ...

  6. C#使用Process类杀死进程,执行命令等

    c#之process类相关整理 一.根据进程名获取进程的用户名? 需要添加对 System.Management.dll 的引用 using System.Diagnostics; using Sys ...

  7. SQL Server ->> 存储过程sp_rename重命名数据对象

    1) 表转移Schema和重命名表 ALTER SCHEMA Stage TRANSFER dbo.Stage_AAA; EXEC sp_rename 'Stage.Stage_AAA', 'AAA' ...

  8. ubuntu 火狐浏览器中常规方法安装flashplayer的问题

    之前在网上看到很多朋友介绍了许多如何在ubuntu安装flashplayer 的方法!但是我的操作系统不知怎么的就是不能成功的安装!使我十分的苦恼!但是在我纲要邪气的时候再网上又看到一位朋友的解决方案 ...

  9. OC 方法声明使用

    Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { int _age; } - (void) ...

  10. windows网络模型之重叠IO(完成例程)的使用

    #include <WINSOCK2.H> #include <stdio.h> #define PORT 5150 #define MSGSIZE 1024 #pragma ...