java: Thread 和 runnable线程类

Java有2种实现线程的方法:Thread类,Runnable接口。(其实Thread本身就是Runnable的子类)

Thread类,默认有run(), start()方法,继承Thread类,需要实现run方法

Thread多线程,不能共享资源,保证数据的的统一(以商城商品数量,售票系统票的数量为例)

例如:

  1. public class MyThread extends Thread {
  2. private String name; // 定义name属性
  3.  
  4. public MyThread(String name) {
  5. this.name = name;
  6. }
  7.  
  8. public void run() {// 覆写run()方法
  9. for (int i = 0; i < 50; i++) {// 表示循环10次
  10. System.out.println("Thread运行:" + name + ",i = " + i);
  11. }
  12. }
  13. }

实现1:

 此种方法说明:mt1线程执行完后,才能执行mt2线程

  1. public class ThreadDemo01 {
  2. public static void main(String[] args) {
  3. MyThread mt1 = new MyThread("线程A") ;
  4. MyThread mt2 = new MyThread("线程B") ;
  5. mt1.run() ; // 调用线程体
  6. mt2.run() ; // 调用线程体
  7. }
  8. }

  

实现2:

start()方法表示,调用系统底层方法,去抢占cpu资源,谁先抢到,谁就能优先得到cpu的调度

  1. public class ThreadDemo02 {
  2. public static void main(String[] args) {
  3. MyThread mt1 = new MyThread("线程A");
  4. MyThread mt2 = new MyThread("线程B");
  5. mt1.start(); // 调用线程体
  6. mt2.start(); // 调用线程体
  7.  
  8. }
  9.  
  10. }

  

Runnable:

  1. public class MyThread implements Runnable { // 实现Runnable接口
  2. private String name; // 定义name属性
  3.  
  4. public MyThread(String name) {
  5. this.name = name;
  6. }
  7.  
  8. public void run() {// 覆写run()方法
  9. for (int i = 0; i < 50; i++) {// 表示循环10次
  10. System.out.println("Thread运行:" + name + ",i = " + i);
  11. }
  12. }
  13. }

  

实现子类:

  1. public class RunnableDemo01 {
  2. public static void main(String[] args) {
  3. MyThread mt1 = new MyThread("线程A");
  4. MyThread mt2 = new MyThread("线程B");
  5. new Thread(mt1).start(); // 调用线程体
  6. new Thread(mt2).start(); // 调用线程体
  7. }
  8. }

  

推荐实现Runnable接口来使用多线程。

使用Runnable能实现资源共享,以商城/售票系统为例,售卖票

Thread例子:

  1. public class MyThread extends Thread {// 继承Thread类
  2. private int ticket = 5; // 一共才5张票
  3.  
  4. public void run() {// 覆写run()方法
  5. for (int i = 0; i < 50; i++) {// 表示循环10次
  6. if (this.ticket > 0) {
  7. System.out.println("卖票:ticket = " + this.ticket--);
  8. }
  9. }
  10. }
  11. }

  

实现子类:

此种方法:其实票一共只有5张,但是三个线程,每个线程都能买到5张票,这样是不符合逻辑的

  1. public class ThreadTicket {
  2. public static void main(String[] args) {
  3. MyThread mt1 = new MyThread(); // 一个线程
  4. MyThread mt2 = new MyThread(); // 一个线程
  5. MyThread mt3 = new MyThread(); // 一个线程
  6. mt1.start() ; // 开始卖票
  7. mt2.start() ; // 开始卖票
  8. mt3.start() ; // 开始卖票
  9. }
  10.  
  11. }

  

实现方法二:

  1. public class MyThread implements Runnable {// 实现Runnable接口
  2. private int ticket = 5; // 一共才5张票
  3.  
  4. public void run() {// 覆写run()方法
  5. for (int i = 0; i < 50; i++) {// 表示循环10次
  6. if (this.ticket > 0) {
  7. System.out.println("卖票:ticket = " + this.ticket--);
  8. }
  9. }
  10. }
  11. }

  

实现子类:

此方法,能实现线程内的资源共享,不会卖出多余的票

  1. public static void main(String[] args) {
  2. MyThread mt = new MyThread(); // 一个对象
  3. new Thread(mt).start() ;// 一个线程开始卖票
  4. new Thread(mt).start() ;//一个线程
    new Thread(mt).start() ; // 一个线程开始卖票
    }
  1. }

  

 

java: Thread 和 runnable线程类的更多相关文章

  1. Java带参数的线程类ParameterizedThread——即如何给Thread传递参数

    在Java中似乎没有提供带运行参数的线程实现类,在第三方类库中也没有找到.网上有大量的文章在讨论这个问题,但都没有提供很好的代码封装解决方案,这令我很吃惊.如果读者知道有官方或者第三方的实现方式,欢迎 ...

  2. Java Thread and runnable

    java中可有两种方式实现多线程, 一种是继承Thread类,(Thread本身实现了Runnable接口,就是说需要写void run 方法,来执行相关操作) 一种是实现Runnable接口 sta ...

  3. Java - Thread 和 Runnable实现多线程

    Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式 概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过jav ...

  4. java核心-多线程(4)-线程类基础知识

    1.并发 <1>使用并发的一个重要原因是提高执行效率.由于I/O等情况阻塞,单个任务并不能充分利用CPU时间.所以在单处理器的机器上也应该使用并发. <2>为了实现并发,操作系 ...

  5. java Thread和Runnable区别

    ①Thread类实现了Runnable接口,主要构造方法为Thread(Runnable target).Thread(Runnable target,String name).Thread(Stri ...

  6. NSThread - (void)start vs java Thread implements Runnable

    This method spawns the new thread and invokes the receiver’s main method on the new thread. If you i ...

  7. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  8. Java多线程并发01——线程的创建与终止,你会几种方式

    本文开始将开始介绍 Java 多线程与并发相关的知识,多谢各位一直以来的关注与支持.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程的创建方式 在 Java 中,用户常用的主动创建 ...

  9. Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

    一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...

随机推荐

  1. mysqldump导出

    mysqldump -u user -p dbname table1 table2 > db.sql mysql执行sql mysql –uroot –p -Dtest < 1.sql

  2. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  3. Spring学习笔记之五----Spring MVC

    Spring MVC通常的执行流程是:当一个Web请求被发送给Spring MVC Application,Dispatcher Servlet接收到这个请求,通过HandlerMapping找到Co ...

  4. qt qml scrollbar 移动APP风格的滚动轴

    依附于Flickable组件的滚动轴    自动放置在恰当位置    拖动时显示,不动时消失Lisence: MIT 请保留此声明Author: surfsky.cnblogs.com 2014-12 ...

  5. Css、javascript、dom(二)

    一.css常用标签及页面布局 1.常用标签 position(定位) z-index(定位多层顺序) background(背景) margin(外边距) padding(内边距) font-size ...

  6. 一个section刷新 一个cell刷新

    一个section刷新   一个cell刷新 //一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; [tabl ...

  7. windows+caffe(五)——实例2MNIST图片

    1. 数据集 MNIST手写体数据.bmp图片:训练集60K张28*28的,测试集10K张28*28的: 训练集: 测试集: 下载地址: 2. 读取图片名称与标签,保存到trainlist.txt与t ...

  8. hdu 4401 Battery

    这里只给出代码,感兴趣的可以作以参考: #include <algorithm> #include <cstdio> #include <cstring> #inc ...

  9. QT笔记之VS2012 TCP传送文件

    注意:工程监理后,因为用到网路,所以要加入对应的库 服务器: .h #ifndef TCPFILE_H #define TCPFILE_H #include <QtWidgets/QWidget ...

  10. 复旦大学2015--2016学年第二学期(15级)高等代数II期末考试第六大题解答

    六.(本题10分)  设 $n$ 阶复方阵 $A$ 的特征多项式为 $f(\lambda)$, 复系数多项式 $g(\lambda)$ 满足 $(f(g(\lambda)),g'(\lambda))= ...