标签:流程 src 多个 控制流 原因 分配 size getname --
5月7号 周末看了一下线程方面的内容 ,边看视频边看书还附带着参考了很多人的博客,一天的收获,写下来整理一下;感觉收获还是挺多的;过段时间可能看完java 这几大块要去看一下关于spring boot 的内容顺便 也整理一下;附上我参考的 几本书;
关于java 线程,首先要了解一下线程和进程之间的关系、区别以及他们之间的概念;
首先是线程:
线程是在程序执行过程中能够执行部分代码的一个执行单元,也看看做是一个轻量级的进程;线程是程序内的程序控制流只能使用程序内分配给程序的资源和环境
关于进程
进程是指正在执行的一种程序(注意:程序是一种静态的概念,进程是一种动态的概念),可以包含多个线程,多个进程的内部数据和状态都是完全独立的
线程与进程之间的比较
多线程
接下来回归到java ,java 中目前常用实现线程的方式
1.先从 Thread 直接 上代码 部分讲解都会在 代码注释中呈现出来 ,
多线程操作注意事项:
下面是常用的三种线程开启使用方法代码:(这两种方法 不提供直接返回值的)
/** * Created by 杨一 on 2017/5/3. */ public class 多线程 { public static void main(String[] args){ /* 调用它的 start 方法 启动线程 start 方法 先回 去准备好线程所使用的系统资源然后去调用Run 方法; * */ ThreadTest1 threadTest = new ThreadTest1(); Thread threadTest2 = new Thread(new ThreaTest2()); threadTest.start(); threadTest2.start(); } } /* * 创建一个线程类 使它继承一个Thread * */ class ThreadTest1 extends Thread { /* 重写run()方法*/ @Override public void run() { super.run(); for(int i=0;i<100;i++) { System.out.println("继承Thread,重写run()方法"+i); } } } /* * 创建一个线程类 使它继承一个Thread * */ class ThreaTest2 implements Runnable{ @Override public void run() { for(int i=0;i<100;i++) { System.out.println("实现Runnable接口 ,重写run()方法"+i); } } }
下面这种线程是se1.5引入的新特性 Callable接口(可以实现带返回值)
public class 多线程 { public static void main(String[] args) throws ExecutionException, InterruptedException { /* *//* 调用它的 start 方法 启动线程 start 方法 先回 去准备好线程所使用的系统资源然后去调用Run 方法; * *//* ThreadTest threadTest = new ThreadTest(); Thread thread = new Thread(threadTest); Thread thread1 = new Thread(threadTest); thread.start(); thread1.start();*/ /* callable 的使用*/ CallableTest callableTest = new CallableTest(); FutureTask<String> futureTask = new FutureTask<String>(callableTest); Thread thread = new Thread(futureTask); thread.start(); System.out.println(futureTask.get()); } } /* callable 实现带返回参数的线程 */ class CallableTest implements Callable<String> { @Override public String call() throws Exception { String aa = "线程中返回的值"; return aa; } }
关于线程停止 本身 stop()方法 是不安全的 关于原因参考:http://blog.csdn.net/jiangwei0910410003/article/details/19900007
一般停止的话 只需要让run()方法不在执行就可以让它自动销毁;代码:
/* * 创建一个线程类 使它继承一个Thread * */ class ThreadTest1 extends Thread { private boolean flag = true; /* 重写run()方法*/ @Override public void run() { super.run(); /* 用while 循环类结束线程 */ while (flag) { for (int i = 0; i < 100; i++) { System.out.println("继承Thread,重写run()方法" + i); } } } }
接下来是关于 多线程同步的问题 :
代码:
public class 多线程 { public static void main(String[] args) { /* 调用它的 start 方法 启动线程 start 方法 先回 去准备好线程所使用的系统资源然后去调用Run 方法; * */ ThreadTest threadTest = new ThreadTest(); Thread thread = new Thread(threadTest); Thread thread1 = new Thread(threadTest); thread.start(); thread1.start(); } } class ThreadTest implements Runnable { int a; @Override public void run() { /*int a = 0;*/ while (true){ System.out.println("数字"+a++); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if(a==20){ break; } } } }
成员变量 和部分变量产生的结果;
java synchronized : 参考:http://blog.csdn.net/luoweifu/article/details/46613015
public class 多线程 { public static void main(String[] args) throws ExecutionException, InterruptedException { /* *//* 调用它的 start 方法 启动线程 start 方法 先回 去准备好线程所使用的系统资源然后去调用Run 方法; * *//* ThreadTest threadTest = new ThreadTest(); Thread thread = new Thread(threadTest); Thread thread1 = new Thread(threadTest); thread.start(); thread1.start();*/ /* callable 的使用*/ /* CallableTest callableTest = new CallableTest(); FutureTask<String> futureTask = new FutureTask<String>(callableTest); Thread thread = new Thread(futureTask); thread.start(); System.out.println(futureTask.get());*/ SyncTest syncTest = new SyncTest(); Thread thread1 = new Thread(syncTest); thread1.start(); Thread thread2 = new Thread(syncTest); thread2.start(); } } /* Syncchronized */ class SyncTest implements Runnable{ @Override public void run() { synchronized (this){ for(int i =5;i>0;i--) { System.out.println(Thread.currentThread().getName()+"--i" +i); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
锁定方法:
锁定类的方法:
/* Syncchronized 锁定方法 */ class SyncTest implements Runnable{ @Override public void run() { /* 对 类 加锁 */ synchronized (SyncTest.class){ for(int i =5;i>0;i--) { System.out.println(Thread.currentThread().getName()+"--i" +i); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
关于 sleep() 和 wait() 不多讲了直接抄一篇博客的内容:http://blog.csdn.net/zidan_2011/article/details/7276468
这两者的施加者是有本质区别的.
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.
而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行.
其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题
在Java.lang.Thread类中,提供了sleep(),
而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程
sleep()可以将一个线程睡眠,参数可以指定一个时间。
而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。
wait有两种形式wait()和wait(milliseconds).
sleep和wait的区别有:
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
标签:流程 src 多个 控制流 原因 分配 size getname --
原文地址:http://www.cnblogs.com/ykjava/p/6812111.html