Runnable,Thread实现多线程以及Runnable的同步资源共享
(一)
实现多线程有两种方式
(1)
继承Thread类,重写run()方法,如以下例子
class MyThread extends Thread{
public void run(){
//
}
}
class Main{
public void main(String[] args){
MyThread thread=new Mythread();
thread.start();
}
}
(2)
利用runnable接口实现,但是若只是定义了Runnable对象,如
public class Myobject
{
public static void main(String[] args)
{
//System.out.println("主线程" + Thread.currentThread().getName());
Runnable myRunnable = new Runnable()
{
@Override
public void run()
{
System.out.println(Thread.currentThread().getName());
}
};
}
}
Runnable对象必须依赖一个Thread类才能真正意义上说是另外开辟了一个线程,不然是默认在主线程中的,在Android更新UI有这种应用,利用runOnUiThread(runnable)来在主线程的某一块调用Runnable的run方法,此时并没有开辟另外的线程,而是在主线程中执行的,这一点应该分清楚。
真正意义上的开辟另外的线程看下面,需要Thread.start()来调用Runnable接口的run方法
class MyThread implements Runnable{
public void run(){
//
}
}
class Main{
public static void main(String[] args){
MyThread thread=new MyThread();//实例化runnable对象
Thread thread1=new Thread(thread);//通过Thread实例化runnable对象
thread1.start();//利用Thread线程类启动Runnable接口的run方法
}
}
(二)在利用Runnable进行多线程时,则有时候需要资源共享
当分配一个任务给多人时,假如要实现资源共享那么就用到
synchronized (this){
同步代码块
}
那我们就举个买票的例子
定义个ThreadTicket类
package MyThread; public class ThreadTicket
{
public static void main(String[] args)
{
MyThread myThread1=new MyThread();
Thread t1 = new Thread(myThread1);//一窗口
Thread t2 = new Thread(myThread1);//二窗口
Thread t3 = new Thread(myThread1);//三窗口
t1.start();
t2.start();
t3.start();
} }
此时的实现MyThread接口类
package MyThread; public class MyThread implements Runnable
{
private int ticket = 10;
@Override
public void run()
{
//synchronized (this)
//{
for (int i = 0; i < 10; i++)
{
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
if (ticket > 0)
System.out.println("车票 :" + ticket--);
}
//}
}
}
由MyThread类可以得出此时的购票总数是10张票,分三个窗口买,那么此时就需要三个窗口共享票源,当没票时就不再进行售票
当不添加synchronized关键字时,此时显示的结果为
可以看到此时的结果是杂乱无章,完全没有达到资源共享
此时应该利用synchronized(this)
{
//code
}
同步代码块来实现资源共享
就是将MyThread的synchronized部分注释解除,此时的结果为

成功实现了资源共享的目的。
Runnable的很大的优点就在于资源共享。
Runnable,Thread实现多线程以及Runnable的同步资源共享的更多相关文章
- Java通过继承thread类与实现Runnable接口实现多线程的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 一.通过继承T ...
- Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别
1. Java中线程的创建有两种方式: (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...
- 【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17161237 Java中实现多线程有两种方法:继承Thread类.实现Runnable接口 ...
- (转)多线程——继承Thread 类和实现Runnable 接口的区别
java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...
- Java中实现多线程继承Thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- 【Java并发编程】:Runnable和Thread实现多线程的区别
Java中实现多线程有两种方法:继承Thread类.实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下 ...
- 【Java并发编程】之六:Runnable和Thread实现多线程的区别
Java中实现多线程有两种方法:继承Thread类.实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下 ...
- Runnable和Thread实现多线程的区别(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17161237 Java中实现多线程有两种方法:继承Thread类.实现Runnable接口 ...
- 2016/1/25 多线程 作业 方法一 继承Thread 方法二 实现Runnable 多线程笔记
/* * 1,尝试定义一个继承Thread类的类,并覆盖run()方法, * 在run()方法中每隔100毫秒打印一句话.*/ package Stream; //方法一 继承Thread 实现多线程 ...
随机推荐
- ASP.NET MVC 学习之路由(URL Routing)
在ASP.NET MVC中,一个URL请求是由对应的一个Controller中的Action来处理的,由URL Routing来告诉MVC如何定位到正确的Controller和Action. 默认路由 ...
- 使用System.IO来读取以及修改文本文件
//1.读取html内容 string htmlUrl = @"new\new.html"; string htmlContent = string.Empty; using (S ...
- MVC之前的那点事儿系列(2):HttpRuntime详解分析(上)
文章内容 从上章文章都知道,asp.net是运行在HttpRuntime里的,但是从CLR如何进入HttpRuntime的,可能大家都不太清晰.本章节就是通过深入分析.Net4的源码来展示其中的重要步 ...
- 基于吉日嘎拉的通用权限管理WebForm版扩展:字典选项管理和缓存管理
关于字典管理,其实就是2个表,一个表记录字典和对应表,另一个表记录字典内容.我这里改名为字典选项,其实是一个意思.直接上图: 这里的字典选项是分子系统的,每个子系统可以有自己的单独字典,方便管理.但是 ...
- Hack语言类型化简介
在typechecker的配合下,Hack语言的类型化能力是Hack其他功能特性的基石.开发Hack语言的主要动机也正是为代码提供显式类型标注以便对代码进行类型一致性和潜在错误分析. 这是用于对比Ha ...
- 关联查询 join on 和比较运算符 in
join on多表之间的关联查询 写法select 字段 from 表1 t join 表2 s on t.字段1 = s.字段1 where 条件: 也可以这么写select 字段 from 表1 ...
- 完善ext.grid.panel中的查询功能(紧接上一篇)
今天的代码主要是实现,Ext.grid.panel中的查询,其实我也是一名extjs新手,开始想的实现方式是另外再创建一个新的grid类来存放查询出的数据(就是有几个分类查询就创建几个grid类),这 ...
- idea配置maven并添加镜像配置
1.打开maven存放文件夹找到 conf ->settings.xml 找到<mirrors>节点把下面内容写入节点内 配置为阿里云的镜像 <mirror> <i ...
- No.015:3Sum
问题: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0?Find all ...
- js undefine,null 和NaN
undefined 类型只有一个值,即 undefined. null 类型也只有一个值,即 null. null 指空值(empty value)或指曾赋过值,但是目前没有值 undefined 指 ...