【Java】【线程】

 

 


/*
栗子 通过Runnable接口实现简历线程实例

*/

class Dog implements Runnable{
//重写run函数
public void run(){
int times = 0 ;
while(true){
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
times++;
System.out.println("hello ,thread_world! " + times);
if(times==10){
break;
}
}

}
}
public class Test_Thread {
public static void main(String[] args){
Dog dog = new Dog();
Thread t = new Thread(dog);
t.start();
}
}
【结果】

"C:\Program Files\Java\jdk1.7.0_67\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.3\lib\idea_rt.jar=6342:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_67\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\rt.jar;D:\zidonghua\java_test_one\target\test-classes" Test_Thread
hello ,thread_world! 1
hello ,thread_world! 2
hello ,thread_world! 3
hello ,thread_world! 4
hello ,thread_world! 5
hello ,thread_world! 6
hello ,thread_world! 7
hello ,thread_world! 8
hello ,thread_world! 9
hello ,thread_world! 10

Process finished with exit code 0

 

 

 

 

 


/*
栗子 多线程实例
1. 一个线程通过接受n来执行1+..+n
2. 另一个线程每隔1秒输出一次hello world!

*/

class Pig implements Runnable{
int n = 0;
int times = 0;
public Pig(int n){
this.n = n;
}
public void run(){
while(true){
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
times++;
System.out.println("我是一个线程,正在输出第" + times + "个hello world!");
if(times == this.n){
break;
}
}
}
}

//算术题
class Bird implements Runnable{
int n = 0;
int res = 0;
int times = 0;
public Bird(int n){
this.n = n;
}

public void run(){
while(true){
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
res += (++times);
System.out.println("当前结果是:"+ res);
if(times == this.n){
System.out.println("最后结果是:" + res);
break;
}
}
}
}
public class Test_Thread {
public static void main(String[] args){
Pig pig = new Pig(5);
Bird bird = new Bird(5);
Thread t1 = new Thread(pig);
Thread t2 = new Thread(bird);
t1.start();
t2.start();

}
}
【结果】

我是一个线程,正在输出第1个hello world!
当前结果是:1
我是一个线程,正在输出第2个hello world!
当前结果是:3
我是一个线程,正在输出第3个hello world!
当前结果是:6
我是一个线程,正在输出第4个hello world!
当前结果是:10
我是一个线程,正在输出第5个hello world!
当前结果是:15
最后结果是:15

 

 

 

 


/*
栗子 深入理解 线程对象只能启动一个线程 不论继承Thread或实现Runnable接口都不能使用start启动同一个线程2次

*/

class Cat extends Thread{
public void run(){
System.out.println("11");
}
}

class Dog implements Runnable{
public void run(){
System.out.println("2");
}
}
public class Test_Thread {
public static void main(String[] args){
Cat cat1 = new Cat();
cat1.start();

Dog dog1 = new Dog();
Thread t = new Thread(dog1);
t.start();
t.start();


}
}
【结果】

Exception in thread "main" 11
2
java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:705)
at Test_Thread.main(Test_Thread.java:26)

 

 

 

两种创建线程的⽅法的区别
创建线程有两种⽅法: 1、继承Thread2、实现Runnable接⼝; 这两种⽅法有什么区别?
⽤实现Runnable接⼝的特点
1、⽤实现Runnable接⼝的⽅法创建对象可以避免java单继承机制带来的局限;
2、⽤实现Runnable接⼝的⽅法,可以实现多个线程共享同⼀段代码(数据)
因此建议⼤家如果你的程序有同步逻辑需求,则使⽤Runnable的⽅法来创建线程。
java线程的同步--提出问题
多线程的并发,给我们编程带来很多好处,完成更多更有效率的程序。但是也给我们带来
线程安全问题。
java线程的同步--解决问题
解决问题的关键就是要保证容易出问题的代码的原⼦性所谓原⼦性就是指:当a线程在
执⾏某段代码的时候,别的线程必须等到a线程执⾏完后,它才能执⾏这段代码。 也就是
排队⼀个⼀个解决。
java处理线程两步的⽅法⾮常简单,只需要在需要同步的代码段,⽤:
synchronized(Object){你要同步的代码}

java线程的同步--解决问题
对同步机制的解释:
java任意类型的对象都有⼀个标志位,该标志位具有01两种状态,其开始状态为1
当某个线程执⾏了synchronized(Object)语句后, object对象的标志位变为0的状态,直到
执⾏完整个synchronized语句中的代码块后,该对象的标志位⼜回到1状态。
当⼀个线程执⾏到synchronized(Object)语句的时候,先检查Object对象的标志位,如
果为0状态,表明已经有另外的线程正在执⾏synchronized包括的代码,那么这个线程将暂
时阻塞,让出CPU资源,直到另外的线程执⾏完相关的同步代码,并将Object对象的标志
位变为状态,这个线程的阻塞就被取消,线程能继续运⾏,该线程⼜将Object的标志位变
0状态,防⽌其它的线程再进⼊相关的同步代码块中。
如果有多个线程因等待同⼀个对象的标志位⾯⽽处于阻塞状态时,当该对象的标志位恢
复到1状态时,只会有⼀个线程能够进⼊同步代码执⾏,其它的线程仍处于阻塞的状态。
特别说明:
1、上⾯所说的标志位⽤术语讲就是对象锁,⽂件锁。数据库会有⾏锁、表锁等
2synchronized(object)//object(就是对象锁)可以是任意类型对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 





















 

posted @ 2018-02-12 14:08  素人渔芙2017  阅读(192)  评论(0编辑  收藏  举报