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 实现多线程 ...
随机推荐
- DirectShowLib directshownet 视频
using DirectShowLib; using System; using System.Collections; using System.Windows.Forms; namespace C ...
- LeetCode - Balanced Binary Tree
题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...
- C# 日志的配置流程
1. 下载log4net.dll文件 http://download.csdn.net/detail/abc456456456456/7653857 2. 项目中引用此dll 3. appconfig ...
- C#开发Windows服务的基础代码
做项目需要对Windows服务进行操作,从网上找了一些资料,总结如下: (以下程序在程序中测试通过) using System; using System.Collections.Generic; u ...
- 一些sql二
1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)法一:select * into b from a where 1<>1(仅用于SQlServer)法二:sel ...
- Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”
整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...
- Asp.net Mvc模块化开发之“部分版本部分模块更新(上线)”
项目开发从来就不是一个简单的问题.更难的问题是维护其他人开发的项目,并且要修改bug.如果原系统有重大问题还需要重构. 怎么重构系统不是本文探讨的问题,但是重构后如何上线部署和本文关系密切.这个大家可 ...
- MySQL的Incorrect string value错误
用以下SQL语句向表2中插入数据: insert into 表2 select * from 表1 结果出现Incorrect string value错误: 打开表2一看,里面全是问号: 后来才发现 ...
- Android自定义surfaceView显示多张图片
我自定义了一个surfaceview,我在上面绘制多张图片,让它能够上下方滚显示图片,但是onMeasure()方法在重写的时候遇到了问题,不知道如何设置它的高度, public class MySu ...
- JavaScript的DOM操作。Window.document对象
间隔执行一段代码:window.setlnteval("需要执行的代码",间隔毫秒数) 例 : window.setlnteval("alert("你 ...