java隋唐演义游戏下载_JAVA多线程
第一節 多線程背景知識介紹
多線程作用:可以幫助簡化模型,還能編寫強大的代碼。進程與線程的基礎概念:Eclipse QQ都屬于進程。進程是程序(任務)的執行過程,它持有資源(共享內存、共享文件)和線程。它包含兩點:1.動態性,雙擊運行之后這才稱之為進程,它是動態的概念;2.持有資源和線程,資源就是內存和文件。進程是資源的載體,也是線程的載體。脫離進程去談論線程就沒有什么意義了。資源就是我們所說的內存,我們知道程序是需要從內存中讀取數據進行運行的,所以每個進程執行的時候都會被分配一個內存。那么線程是是什么呢?當你運行Eclipce你要進行一些任務,比如你要在文本編輯區編寫源代碼,我們的Eclipce會自動在后臺編譯我們的源代碼,有的代碼還有語法效驗,再看QQ聊天,發文件,所有這些任務我們都可以把他們理解成線程。如果把進程比作一個班級,可以把每個學生比作一個線程,學生是班級中的最小單元。一個班級可以有多個學生,他們都使用班級中共同的板凳、桌椅、黑板、粉筆等來進行他們的學習生活。這個意義上我們說線程是系統中最小的執行單元,同一個進程中可以有多個線程,線程共享進程的資源。
線程的交互:如一個班級中的學生一樣,我們說多個線程需要通信才能正確的工作,這種通信我們把它稱之為線程的交互。交互的方式包括互斥和同步。將概念類比到班級中,我們的同學之間需要通過相互的協會來完成某些任務,有時這些協作是需要競爭的。比如學習,班級的公共資源是有限的,愛學習的同學需要搶占,需要競爭,一個同學用完了下一個同學才能使用,如果一個同學正在使用,那么其他新來的同學只能等待。另一方面我們又需要同步或者協作,好比班級六一需要排演一個節目,全班同學齊心協力,相互配合,才能把節目完美的呈現在學校面前,這些就是線程的交互。
第二節 JAVA線程初體驗
JAVA線程中常用方法介紹:1.java對線程的支持;2.如何用java創建并啟動線程;3.線程常用的方法和那些含義;4.如何停止線程。
java語言對線程的支持,主要體現在class Thread 類里以及interface Runnable這個接口上,它們都寄生于java.lang包,無論是Thread這個類還是Runnable這個interface,里面都有一個共通的方法,就是我們的,public void run(),run方法為我們提供了線程實際工作執行的代碼,一般都會復寫。
下面我們看看線程中常用的方法:
Thread常用方法
a.線程的創建
Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target,String name)
這四個是常用的線程構造函數
b.線程的方法
void start() 啟動線程
static void sleep(long millis)
static void sleep(long millis,int nanos)
可以讓線程休眠指定的時間,millis毫秒,nanos納秒
void join()
void join(long millis)
void join(long millis,int nanos)
調用線程,可以讓其他線程等待自己運行,直到結束。
這里第一個方法沒有參數,其它的線程一定要等待我們的執行線程執行完畢之后才會獲得運行的機會,帶參數的則指明了一個時間閾值,最長需要等待的時間,這個時間單位是毫秒,我們可以通過第二個參數將時間精確到納秒
static void yield()
當前正在運行的線程釋放處理器資源并重新去競爭處理器資源
static Thread currentThread()
返回當前正在處理器上運行的線程的引用
第三節 JAVA線程-隋唐演義框架說明
1.設計一個隋唐演義程序來模擬線程的執行,首先是隋唐之間的農民戰爭,一定會有戰爭的軍隊,用對象來分別模擬我們的隋朝軍隊和農民起義軍。因為雙方軍隊的戰爭行為都是各自實行的,所以我們用Runnable對象可以非常輕而易舉的隔離雙方的差異,使其各自為戰,以便于我們抽象實現。
//軍隊線程
//模擬作戰雙方的行為
public class ArmyRunnable implements Runnable{
ArmyRunnable armyTaskOfSuiDynasty=new ArmyRunnable();
ArmyRunnable armyTaskOfRevolt=new ArmyRunnable();
//army 陸軍 軍隊;Task 任務 工作;Of 屬于;Dynasty 王朝 Revolt 反叛
//完成上面的任務等于是建立了兩個軍隊的對象,然后創建線程
public void run(){}
//復寫run方法
}
//使用Runnable接口創建線程
Thread armyOfSuiDynasty=new Thread(armyTaskOfSuiDynasty,"隋軍");
Thread armyOfRevolt=new Thread(armyTaskOfRevolt,"農民軍");
2.英雄人物可以推動歷史發展,關鍵人物的線程來模擬英雄人物
public class KeyPersonThread extends Thread{
public void run(){
//復寫run方法
//輸出某軍名字+開始戰斗 可以用Thread.currentThread().getName
}
}
3.需要有一個舞臺線程,把所有元素融合進來 class Stage extends Thread
第四節 隋唐演義實戰開發I
這里我們首先先實驗下Thread類和Runnable類的使用,假如我們的演員是兩個人,Mr.Thread 和Ms.Runnable,Thread先生和Runnable小姐,讓他們交替上臺表演。后面貼代碼
這里先把學習的經驗總結一下:
每一個java文件中只能有一個public類,直接在當前類的末尾新建其它類也可以,但是不能寫public,這里所說的不是內部類是獨立的外部類,當然直接新建一個java文件單獨建類或者直接class 類名都可以。
兩種方法實現線程:
1、繼承 Thread 類
class MyThread extends Thread{};
Thread myThread = new MyThread();
myThread.start();
2、實現Runnable接口
class MyRunnable implements Runnable{}
Thread myRunnable = new Thread(new MyRunnable);
myRunnable.start();
3、Thread啟動后執行run()方法
4、若實現接口通過Thread.currentThread().getName()方法獲取當前線程名稱,繼承Thread則getName()方法獲取當前線程。
Thread類的方法:
.getName() 返回線程的名字
.setName(String Name) 改變線程的名字
.start() 使該線程開始執行,Java 虛擬機調用該線程的 run 方法。
.sleep(long millis) 在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程序精度和準確性的影響。線程不丟失任何監視器的所屬權。
.currentThreat() 返回對當前正在執行的線程對象的引用。(靜態方法,返回Thread類型)
package actor;
/**
* Created by Administrator on 2017/4/6.
*/
//創建一個類繼承自Thread類。
public class Actor extends Thread {
//在我們的類中復寫我們的run()方法
public void run(){
//這里調用getName()方法來獲得我們當前線程的名稱
System.out.println(getName()+"是一個演員!");
//給出一個計數器來顯示線程先生出場演出了多少次
int count=0;
boolean keepRunning=true;
while(keepRunning){
System.out.println(getName()+"登臺演出了:"+(++count));
if(count==100){
keepRunning=false;
}
if(count%10==0){
try {
//每演出10場后,停頓休眠1S
Thread.sleep(1000);
//millis是毫秒,1S=1000millis
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//這里使用count++和++count輸出的結果不同,后者是1,前者是0
System.out.println(getName()+"的演出結束了!");
}
public static void main(String[] args) {
Thread actor=new Actor();
//這里我們可以看到 父類的引用指向了子類的實例,多態
//換成Actor程序一樣可以運行
actor.setName("Mr.Thread");
//調用setName()方法給線程設置名字
actor.start();
//調用.start方法開始線程
Thread actressThread=new Thread(new Actress(),"Ms.Runnable");
//我們有了第二個類,可以創建一個新的對象,調用Thread類的構造函數
// 通過接收我們實現了Runnable接口的對象來創建線程,或者也可以調用
//setName也沒有問題
actressThread.start();
}
}
//在actor類后新建一個類,注意在我們的.java文件中,可以有多個類,但是只能
//有一個public類這里所說的不是內部類,而都是一個獨立的外部類。
//或者單獨新建一個類也可以,這都沒有任何問題
class Actress implements Runnable{
@Override
public void run() {
//這里復制上面的方法調用getName(),但由于Runnable中
// 沒有getName方法,所以我們要用Thread.currentThread()
// 來獲取當前線程的引用,來獲得我們當前線程的名稱
System.out.println(Thread.currentThread().getName()+"是一個演員!");
//給出一個計數器來顯示線程先生出場演出了多少次
int count=0;
boolean keepRunning=true;
while(keepRunning){
System.out.println(Thread.currentThread().getName()+"登臺演出了:"
+(++count));
if(count==100){
keepRunning=false;
}
if(count%10==0){
try {
//每演出10場后,停頓休眠1S
Thread.sleep(1000);
//millis是毫秒,1S=1000millis
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//這里使用count++和++count輸出的結果不同,后者是1,前者是0
System.out.println(Thread.currentThread().getName()+"的演出結束了!");
}
}
//作為計算機處理器CPU或者同一個核同時只能運行一條線程
//當我們的一條線程休眠之后,另外一條線程才獲得了我們的處理器時間
//這就是我們兩個演員交替演出的情況
第五節 隋唐演義實戰開發II
package threadInImooc;
/**
* Created by Administrator on 2017/4/6.
* 軍隊任務線程,模擬作戰雙方的行為
*/
public class ArmyRunnable implements Runnable {
volatile boolean keepRunning=true;
//volatile 是java的一個關鍵字,必須將keepRunnings聲明設置為volatile類型
//保證了線程可以正確讀入其他線程寫入的值。
//軍隊必須在得到命令之前持續的保持進攻的態勢,那么是誰來下達關鍵的命令,
//英雄人物也好,舞臺策劃也好是有外部的一個線程來告訴我們軍隊的線程你們應該
//停止攻擊了,我們應該轉入其他環節,這個時候我們就寫入keepRunning的值
//如果不聲明由于可見性的問題,我們的當前線程有可能不能正確的讀到這個值。
//關于可見性我們可以參考我們的, ref JMM java內存模型,里面詳細的講述了
//什么是happens-before原則,以及為什么這個關鍵詞解決了這個可見性問題
//軍隊線程,模擬作戰雙方的行為
@Override
public void run() {
//當填入keepRunning之后,按住Alt+Enter(eclipce應該是ctrl+1)
//選擇create field keepRunning,keepRunning作為一個開關,
//沒有收到停止時就繼續作戰
while(keepRunning){
//每次攻擊都會發送五連擊
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+
"進攻對方"+"["+i+"]");
//提供當前進攻批次的信息
//我們通過一些技術手段可以使他們更公平的競爭使得對手還有還手的機會
Thread.yield();//釋放當前線程的處理器資源,并重新去競爭處理器資源
//讓出了處理器時間下次誰進攻還不一定了
}
}
System.out.println(Thread.currentThread().getName()+"結束戰斗了!");
}
}
package threadInImooc;
/**
* Created by Administrator on 2017/4/6.
*隋唐演義的大戲舞臺
*/
public class Stage extends Thread {
public void run(){
//利用軍隊線程引入我們的軍隊
ArmyRunnable armyTaskOfSuiDynast=new ArmyRunnable();
//隋軍作戰任務對象
ArmyRunnable armyTaskOfRevolt=new ArmyRunnable();
//農民起義軍作戰任務對象
Thread armyOfSuiDynast=new Thread(armyTaskOfSuiDynast,"隋軍");
//創建軍隊線程隋軍
Thread armyOfRevolt=new Thread(armyTaskOfRevolt,"農民起義軍");
//創建軍隊線程起義軍
//啟動線程,調用兩個線程的start方法,讓軍隊開始作戰。
armyOfRevolt.start();
armyOfSuiDynast.start();
//大家知道戰爭細節宏大我們觀眾不希望被其他細節所打擾,所以讓舞臺線程
//暫時休眠。
//舞臺線程休眠50毫秒,大家專心看軍隊廝殺
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
armyTaskOfSuiDynast.keepRunning=false;
armyTaskOfRevolt.keepRunning=false;
try {
armyOfRevolt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Stage().start();
}
}
第六節 隋唐演義實戰開發 III
軍隊線程:
package threadInImooc;
/**
* Created by Administrator on 2017/4/6.
* 軍隊任務線程,模擬作戰雙方的行為
*/
public class ArmyRunnable implements Runnable {
volatile boolean keepRunning=true;
//volatile 是java的一個關鍵字,必須將keepRunnings聲明設置為volatile類型
//保證了線程可以正確讀入其他線程寫入的值。
//軍隊必須在得到命令之前持續的保持進攻的態勢,那么是誰來下達關鍵的命令,
//英雄人物也好,舞臺策劃也好是有外部的一個線程來告訴我們軍隊的線程你們應該
//停止攻擊了,我們應該轉入其他環節,這個時候我們就寫入keepRunning的值
//如果不聲明由于可見性的問題,我們的當前線程有可能不能正確的讀到這個值。
//關于可見性我們可以參考我們的, ref JMM java內存模型,里面詳細的講述了
//什么是happens-before原則,以及為什么這個關鍵詞解決了這個可見性問題
//軍隊線程,模擬作戰雙方的行為
@Override
public void run() {
//當填入keepRunning之后,按住Alt+Enter(eclipce應該是ctrl+1)
//選擇create field keepRunning,keepRunning作為一個開關,
//沒有收到停止時就繼續作戰
while(keepRunning){
//每次攻擊都會發送五連擊
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+
"進攻對方"+"["+i+"]");
//提供當前進攻批次的信息
//我們通過一些技術手段可以使他們更公平的競爭使得對手還有還手的機會
Thread.yield();//釋放當前線程的處理器資源,并重新去競爭處理器資源
//讓出了處理器時間下次誰進攻還不一定了
}
}
System.out.println(Thread.currentThread().getName()+"結束戰斗了!");
}
}
關鍵人物線程
/**
* Created by Administrator on 2017/4/6.
*/
public class KeyPersonThread extends Thread {
//定義了一個關鍵人物類,復寫run方法。
public void run(){
System.out.println(Thread.currentThread().getName()+"開始了戰斗!");
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+
"左突右殺,攻擊隋軍...");
}
System.out.println(Thread.currentThread().getName()+"結束了戰斗!");
}
}
舞臺線程
/**
* Created by Administrator on 2017/4/6.
*隋唐演義的大戲舞臺
*/
public class Stage extends Thread {
public void run(){
System.out.println("歡迎觀看隋唐演義");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("大幕徐徐拉開");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("話說隋朝末年,隋軍與農民起義軍殺得昏天黑地...");
//利用軍隊線程引入我們的軍隊
ArmyRunnable armyTaskOfSuiDynast=new ArmyRunnable();
//隋軍作戰任務對象
ArmyRunnable armyTaskOfRevolt=new ArmyRunnable();
//農民起義軍作戰任務對象
Thread armyOfSuiDynast=new Thread(armyTaskOfSuiDynast,"隋軍");
//創建軍隊線程隋軍
Thread armyOfRevolt=new Thread(armyTaskOfRevolt,"農民起義軍");
//創建軍隊線程起義軍
//啟動線程,調用兩個線程的start方法,讓軍隊開始作戰。
armyOfRevolt.start();
armyOfSuiDynast.start();
//大家知道戰爭細節宏大我們觀眾不希望被其他細節所打擾,所以讓舞臺線程
//暫時休眠。
//舞臺線程休眠50毫秒,大家專心看軍隊廝殺
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("正當雙方激戰正酣,半路殺出個程咬金");
Thread mrCheng=new KeyPersonThread();
mrCheng.setName("程咬金");
System.out.println("程咬金的理想就是結束戰爭,使百姓安居樂業!");
//此時要開始這個線程,同時為了將關鍵人物的作用體現出來,先將另外兩邊
//的軍隊停止線程,也就是while循環停止,給true變false
armyTaskOfSuiDynast.keepRunning=false;
armyTaskOfRevolt.keepRunning=false;
//隋軍和農民起義軍線程停止,停止線程的方法
//下達命令之后我們要讓我們的舞臺劇休眠一會,這樣可以讓我們的軍隊
//確實執行停戰命令
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 歷史大戲留給關鍵線程。
*/
mrCheng.start();
//在萬眾矚目之下,所有的線程都應該等待我們的程先生,所以要調用
//join方法,所有線程等待程先生完成歷史使命
try {
mrCheng.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//假如把join方法注釋掉,就會出現舞臺線程的后兩句穿插輸出了,之后
//才執行我們關鍵先生的線程。join在程序的結束非常有用
System.out.println("戰爭結束,人民安居樂業,程先生實現了積極的人生理想" +
",為人民做出了貢獻!");
System.out.println("謝謝觀看隋唐演義,再見!");
}
public static void main(String[] args) {
new Stage().start();
}
}
總結
以上是生活随笔為你收集整理的java隋唐演义游戏下载_JAVA多线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux nslookup命令安装,在
- 下一篇: php读取云平台数据库,读取Read ·