多线程写法 与老虎机的制作
多线程的使用
Java中最基本的单位:Class
============================================================================
Java所支持的一种技术:多线程;不是所有编程语言都支持。进程:是指一个内存中运行的应用程序,
每个进程都有一个独立的内存空间,
一个应用程序可以同时运行多个进程;
进程也是程序的一次执行过程,
是系统运行程序的基本单位;
系统运行一个程序即是一个进程从创建、
运行到消亡的过程。线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以理解为一个进程便相当于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。
=========================================================================================
一、概念--(火车站买票)
1. 进程与线程
a. 进程---就是一个内存中正在进行的程序。
CPU在某一时间段只处理一个程序。
程序也是一个进程,当程序结束,进程消失。b. 线程---就是程序中的一个执行路径(控制单元)
线程在控制着进程的执行;
它是真正的执行者。进程与线程的关系:一个进程中至少包含有一个或多个线程。(图解)
示例:得到当前线程名
System.out.println(Thread.currentThread().getName());示例:创建一个线程,测试主线程与其他线程
效率高是因为利用了程序间进入CPU的时间差
2. 多线程存在的意义
多线程可以让我们的程序部分可以产生同时运行的效果,各玩各的。
提高效率是其次,主要是能让多段代码同时执行。3. 多线程的目的:
为了最大限度的利用CPU资源。4. 多线程的好处与弊端
好处:解决了多部分同时运行的问题
弊端:线程太多反倒效率的降低5. 线程调度:
按照特定的机制为多个线程分配CPU的使用权。调度的模式有两种:
(1) 分时调度:所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;
(2) 抢占式调度:根据线程的优先级别来获取CPU的使用权。
JVM的线程调度模式采用了抢占式模式。总结:虽然操作系统是多线程的,但CPU每一时刻只能做一件事,和人的大脑是一样的。
====================================================
在Java中,多线程的实现有两种方式:
继承java.lang.Thread类
实现java.lang.Runnable接口
====================================================二、线程创建方式一:继承Thread类
关键词:Thread、run()、start()
1. Thread类创建,分两种写法:
步骤:
第1步:定义类继承Thread类;
第2步:子类中重写Thread类中的run()方法;
第3步:调用线程的start()方法写法一:
子类:-------------------------------------------------
public class Person extends Thread{
@overriad
public void run(){
System.out.println("这是个线程");
}
}测试类:------------------------------------------------
Person ps=new Person(); //初始化线程
ps.start(); //启动线程并调用run方法写法二:
测试类:------------------------------------------------
new Thread(){
@overriad
public void run(){
System.out.println("这是个线程");
}
}.start();***************************************************
实现Runnable接口写法-------------------------------
class Puy implements Runnable{
@overriad
public void run(){
System.out.println("这是个线程");
}}
测试类:------------------------------------------------
public static void main(String[] args) {
Puy y=new Puy();
new Thread(y,"窗口A").start();}
1. 为什么要重写run方法?
目的:将自定义的代码存储在run方法中,让线程运行(也就是将同时要运行的代码写在run()方法中)。
2. 通过对象.run()调用,不用start()方法调用也可以吗?
可以,但run()就变成主线程中的方法,与线程没关系。
因为线程没有开启,你只执行了调用。
3. run()方法中仅仅是封装多线程运行的代码,而start()则是开启多线程的钥匙。
4. start()方法是开启多线程,并执行run()方法。
5. 多线程的一个特性:随机性(谁抢到谁执行,至于执行多长,CPU说了算)run()方法:在本线程内调用run()方法,和其他方法没有什么区别,可以重复多次调用;
start()方法:启动一个线程,实际上还是调用该Runnable对象的run()方法。
===================================================================
三、线程的操作
1. 获取线程的名字
Thread.currentThread().getName();2. 设置线程优先级
(1)每个线程都有一个优先级;
(2)高优先级线程的执行优先于低优先级线程;
(3)每个线程都可以或不可以标记为一个守护程序。
(4)当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
setDaemon(true)
//标识将该线程设置为后台线程,或者叫守护线程,或者叫精灵线程
例:对象.setDaemon(true)setPriority()
//设置的优先级一定要足够长时间才会有效果
例:对象.setPriority(Thread.MAX_PRIORITY); //设置最高级别10
对象.setPriority(Thread.MIN_PRIORITY); //最低级别1
对象.setPriority(Thread.NORM_PRIORITY); //值为5注意:
(1)设置线程优先级的代码,要放在.start()前面。
(2)优先级高不一定代表该线程就先抢到执行权,理论是是可以,但实际情况不一样。=================================================================
四、线程的状态(生命周期)
||===> 阻塞(临时状态)
|| (有执行资格,没执行权)
t3 t4 t5 ||
start() || sleep(time)
新建 ========> 运行 =============> 冻结(睡眠|等待)
|| wait()/notify()
stop() ||
||
消亡(真死了)1.新建:刚new出来在内存中
2.就绪:start表示该线程有资格抢CPU!
3.运行:抢到了CPU,会执行run方法
4.冻结:放弃了执行资格,醒了获得执行资格,但不一定马上执行。
4.死亡:执行完run方法
5.阻塞:调用了sleep方法或其他阻塞的方法执行资格与执行权
没执行资格的情况下,是冻结状态;
有执行资格的是临时状态;
既有执行资格又有执行权的是运行状态。友情小知识点:
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:线程的优势
1、进程之间不能共享内存,而线程之间可以共享内存。
2、系统创建进程需要为该进程重新分配系统资源,创建线程的代价则小的多,因此多任务并发时,多线程效率高。
3、Java 语言本身内置多线程功能的支持,而不是单纯作为底层系统的调度方式,从而简化了多线程编程。
注意:多线程是为了同步完成多个任务,不是为了提高程序运行效率,而是通过提高资源使用效率来提高系统的效率。
老虎机的编写
package com.baidu;import java.awt.Color;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;public class MyGame extends JFrame{private boolean fie=true;private long fin=0;private long fis=50;private JPanel jpa=new JPanel();private JLabel jla=new JLabel(new ImageIcon("images//1.png"));private JLabel jlb=new JLabel(new ImageIcon("images//2.png"));private JLabel jlc=new JLabel(new ImageIcon("images//3.png"));private JButton jba=new JButton("开始");private JButton jbb=new JButton("停止");private String[] ima= {"images//1.png","images//2.png","images//3.png","images//4.png","images//5.png","images//6.png",};public MyGame() {this.setTitle("");this.setSize(400,300);this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);//设置标签边框jla.setBorder(BorderFactory.createLineBorder(Color.black));jlb.setBorder(BorderFactory.createLineBorder(Color.black));jlc.setBorder(BorderFactory.createLineBorder(Color.black));jpa.setLayout(null);jla.setBounds(50, 40, 87, 87);jpa.add(jla);jlb.setBounds(147, 40, 87, 87);jpa.add(jlb);jlc.setBounds(244, 40, 87, 87);jpa.add(jlc);jba.setBounds(120, 167, 60, 40);jpa.add(jba);jbb.setBounds(200, 167, 60, 40);jpa.add(jbb);jbb.setEnabled(false);this.getContentPane().add(jpa);jba.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {jba.setEnabled(false);myshow(jla);myshow(jlb);myshow(jlc);jbb.setEnabled(true);fie=true;new Thread() {public void run() {while(fie) {try {Thread.sleep(fis);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}myshow(jla);myshow(jlb);myshow(jlc);fin+=25;if(fin>1400) {fis+=30; }if(fis>=450) {jba.setEnabled(true);jbb.setEnabled(false);fin=0;fis=50;break;}}};}.start();}});jbb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {fin=1400;}});this.setVisible(true);
}
public void myshow(JLabel jla) {Random rd=new Random();int sj=rd.nextInt(6);jla.setIcon(new ImageIcon(ima[sj]));
}public static void main(String[] args) {new MyGame();}}
多线程写法 与老虎机的制作相关推荐
- C++新老多线程写法的比较【水一下】
C++11之前的<pthread.h>写法 #include<bits/stdc++.h>using namespace std;int vall=-1;void* func1 ...
- 妹子说头像爬的太慢?升级到多线程程序爬取头像
需求分析 昨天,我给妹子做了一个爬取头像的爬虫程序,妹子总算是开心起来了,我总算也是松了一口气,然而今天,就接到妹子的投诉了 她说,"你这个程序啊,太慢!爬取一次要花的时间太长!你能不能给改 ...
- Python多线程,大杂烩
搞任何编程语言肯定都离不开多线程,Python肯定也不例外,虽然Python的多线程并不完美,但还是经常会用到滴,尤其是网络爬虫这些东西,效率很很重要,所以我就屁颠屁颠的来写这篇文章啦! 多线程是为了 ...
- 浅谈易语言多线程 by逆风
一.简介 1.线程句柄与线程: ①.关闭线程句柄对线程的运行不会有影响,关闭句柄并不代表结束线程: ②.线程句柄是用于对线程挂起.恢复.结束等操作,线程创建后,都会有一个线程句柄,如果不需要对线程句柄 ...
- 简单说说对QT中moveToThread实现多线程操作的理解
在平时的编码过程中经常碰到QT的多线程问题,也大量接触了QT中的两种主流多线程写法,一种是继承QThread类并重载run函数,在run函数中写一个状态机或者计时器来实现对线程运作:一种是通过mo ...
- 信息化基础建设 开发框架
开发框架 1. ORM, LLBL Gen,NHibernate 2. 接口与实现分离,界面与逻辑分离,分五个项目, BusinessLogic, Interface,Manager,Vali ...
- html语言ppt,HTML语言课件.ppt
补充:HTML语言 1. HTML简介 2. HTML显示原理 3. HTML制作工具 二. HTML标记 通过用记事本制作第一个HTML文档来了解:用HTML制作网页的一般步骤.一个HTML文档的基 ...
- 逆向爬虫08 并发异步编程
逆向爬虫08 并发异步编程 我将引用我最喜欢的路飞学城林海峰Egon老师的讲课方式来复习这一节的内容. 1. 什么是并发异步编程? 这一部分的内容来源于计算机操作系统,如果想要详细了解并发异步等概念, ...
- 杰奇是否生成html,杰奇1.70如何自定义页面
这个自定义页面是指php页面,具有和其他页面统一的头部和底部.并且可以调用系统区块的. 这种页面的制作可以参考文件 custom.php的写法,它是制作首页的模拟文件. 首选制作首页的模拟文件. 您需 ...
最新文章
- 需要将git分支重置为原始版本
- [Issue Fixed]-Ubuntu开发环境下遇到的环境问题梳理
- SQL注入之布尔盲注——sql-lab第八关
- javascript变量中基本类型和引用类型的详解解读
- TensorFlow(六)with语句
- 新版的sublime text 3无法设为默认启动程序
- java springboot aop_Spring Boot实战系列(3)AOP面向切面编程
- springboot 对接海康设备
- 个人主页博客网页设计制作HTML5+CSS大作业——清新春暖花开个人博客网站(6页)
- mysql批量生成随机姓名、手机号等数据
- java11降到java8
- 31个惊艳的数据可视化作品,让你感受“数据之美”!
- linux批处理模式,巧用linux-top的批处理模式
- Object不能直接转成int
- js判断早上好,上午好,中午好,下午好,晚上好
- 编程基础知识(变简单的进制转换)
- 【翻译】听觉刺激增强深度睡眠,实现“熟睡自由”
- 消息中间件原理及JMS简介(2)
- 绝了!美图技术专家获取肉鸡服务器密码如探囊取物
- elasticsearch 中文API river