1、概念:线程是运行程序(进程)中单个顺序的小程序,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使得线程间的通信比较容易。在一个多进程的程序中,如果要切换到另一个进程,需要改变地址空间的位置。然而在多线程的程序中,就不会出现这种情况,因为它们位于同一个内存空间内,只需改变运行的顺序即可。

2、什么是多线程:多线程指单个程序可通过同时运行多个不同线程,以执行不同任务。所谓同时,也要依据CPU。如果是多个CPU,则并发运行,如是一个CPU,则根据系统具体情况,执行多个线程。

3、创建线程的方法一般有两种:

一种是通过实现Runnable接口的方式创建线程。

一种是通过从Thread类中去继承来创建线程。

4、线程的优先级:

【Demo】

 computer t = new compute();

 computer1 t = new compute1();

 //setPriority是一个从1~10之间的正整数,数值越大,优先级别越高

 //系统默认的优先级是5

 t.setPriority(10);

 t.start();

 t1.start();

5、线程的休眠与唤醒:

//休眠

 sleep(毫秒数);

//唤醒

【Demo】

 compute t = new computer();

 t.start();

 t.interrupt();
 class compute extends Thread{

 int i=0;

 public void run()

 {

 System.out.println("在工作中,不要打扰");

 try

 {

   sleep(1000000);

 }

 catch(Exception e)

 {System.out.println("哦,电话来了");

 }

 }

 }

因为使用了唤醒语句后,在输出“在工作中,不要打扰”后休眠。然后又立即会被唤醒输出“哦,电话来了”。

6、线程让步:

所谓线程让步,就是使当前正在运行的线程对象退出运行状态,让其他线程运行,其方法是通过调用yield()来实现。这个方法不能将运行权让给指定的线程,只是允许这个线程把运行权让出来,至于给谁,这就是抢占功能的事情了。

【Demo】

 public class thread1{

 public static void main(String[] args){

 compute t = new compute();

 compute t1 = enw compute1();

 t.start();

 t1.start();

 }

 }

 class compute extends Thread{

 int i=0;

 public void run(){

 for(int i=0;i<10;i++){

 System.out.println(i);

 yield();

 }

 }

 }

 class compute1 extends Thread{

 public void run(){

 for(int i=0;i<10;i++){

 System.out.println("这个数字是:"+i);

 }

 }

 }

运行结果:

0

这个数字是:0

这个数字是:1

这个数字是:2

这个数字是:3

这个数字是:4

这个数字是:5

这个数字是:6

这个数字是:7

1

这个数字是:8

这个数字是:9

2

3

4

5

6

7

8

9

从运行结果来看,第一个线程比第二个线程运行的几率要小,因为它总是放弃运行权。

7、线程同步:

【Demo】

 public class thread11{

 public static void main(String[] args){

 compute t = new compute();

 new Thread(t).start();

 new Thread(t).start();

 new Thread(t).start();

 }

 }

 class compute extends Thread{

 int i=10;

 static Object obj= new Object();

 public void print(){

 System.out.println(Thread.currentThread().getName()+":" +1);

 i--;

 }

 public void run(){

 while(i>0){

 synchronized(obj){
print(); } try { sleep(1000); } catch(Exception e){} } } }

运行结果

Thread-1:10

Thread-2:9

Thread-3:8

Thread-1:7

Thread-2:6

Thread-3:5

Thread-1:4

Thread-2:3

Thread-3:2

Thread-1:1

这里用到的是同步块的概念

synchronized(someobject)
{
代码块
}

也可以写成同步化方法的方式

 synchronized void f()
{
代码块
}

【Demo】

 synchronized void print(){

 System.out.println(Thread.cui--);

 }

答疑-线程和线程之间怎么通信?

答:共享一个变量,并对此变量的访问进行同步,因为它们共享一个内存空间,所以相比之下,它比进程之间通信要简单容易的多。

答疑-什么是线程的饥饿?

答:饥饿是由于别的并发进程的激活,而导致持久占有所需资源。饥饿是一个异步过程,预测的时间内不能被激活,最常遇到的线程的两个缺陷是死锁和饥饿。

答疑-什么是线程的死锁?

答:当一个或多个进程,在一个给定的任务中,协同作用、互相干涉,而导致一个或者更多进程永远等待下去,死锁就发生了。

与此类似,当一个进程永久性地占有资源,使得其他进程得不到该资源,就发生了饥饿。

Java线程问题(基础回顾)的更多相关文章

  1. Java线程核心基础(上)

    Java线程核心基础(上) 一.实现多线程 根据Oracle官方文档,目前推荐的创建线程方法主要有两种,分别是继承Thread类和实现Runnable接口.通过阅读Thread类源码,可以发现二者不同 ...

  2. Java线程池基础

    目录: 一.线程池概述 二.线程池参数 三.线程池的执行过程 四.线程池的主要实现 五.线程池的使用 六.线程池的正确关闭方式 七.线程池参数调优 一.线程池概述 1.线程池类 目前线程池类一般有两个 ...

  3. Java线程并发控制基础知识

    微博上众神推荐今年4月刚刚出版的一本书,淘宝华黎撰写的<大型网站系统与Java中间件实践>,一线工程师的作品,实践出真知,果断要看. 前两章与<淘宝技术这十年>内容类似,基本是 ...

  4. Java线程之基础

    Java内存模型(jmm) 线程通信 消息传递 重排序 顺序一致性 Happens-Before As-If-Serial 一.线程的生命周期及五种基本状态 线程生命周期:新建.就绪.运行.阻塞.死亡 ...

  5. java线程锁基础

    定义运行方法 package com.company; // 包名import java.util.concurrent.locks.ReentrantLock;import java.util.co ...

  6. java线程基础知识----线程与锁

    我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...

  7. 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型

    关于线程,博主写过java线程详解基本上把java线程的基础知识都讲解到位了,但是那还远远不够,多线程的存在就是为了让多个线程去协作来完成某一具体任务,比如生产者与消费者模型,因此了解线程间的协作是非 ...

  8. Java线程和多线程(十三)——Callable,Future,FutureTask

    在Java多线程之中,Callable和Future的使用时非常广泛的.在之前的文章中,我们了解了关于Java线程池基础的一些内容,知道如何提交Runnable的任务.但是,Runnable的任务是无 ...

  9. 多线程(一)java并发编程基础知识

    线程的应用 如何应用多线程 在 Java 中,有多种方式来实现多线程.继承 Thread 类.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实现带 ...

  10. java基础回顾(五)线程详解以及synchronized关键字

    本文将从线程的使用方式.源码.synchronized关键字的使用方式和陷阱以及一些例子展开java线程和synchronized关键字的内容. 一.线程的概念 线程就是程序中单独顺序的流控制.线程本 ...

随机推荐

  1. Python 数据分析—第九章 数据聚合与分组运算

    打算从后往前来做笔记 第九章 数据聚合与分组运算 分组 #生成数据,五行四列 df = pd.DataFrame({'key1':['a','a','b','b','a'], 'key2':['one ...

  2. airpods2代连接macbook失败

    更新至最新系统(10.14.4),更新完毕,重启电脑再次连接即可. 参考连接: http://dq.tieba.com/p/6082366443

  3. memcached整理の分布式集群算法

    memcached如何实现分布式? memcached是一个“分布式内存对象缓存系统”,然而memcached并不像mongodb那样,允许配置多个节点,且节点之间“自动分配数据”,就是说memcac ...

  4. jquery实现简单抽奖功能

    一直纠结要怎么用jquery实现抽奖功能,看别人很多都是用flash制作的,找了很多资料,最终找到一个比较适合需求的,我做了些许调整,以下是代码展示(复制下来可以直接使用). 先上图:

  5. solr入门教程-较详细

    Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在 ...

  6. WebService 常用的设置

    1.修改WebService接收长度 <binding name="IAuthServiceSoap11Binding" maxBufferSize="214748 ...

  7. C#中数组作为参数传递的问题

    原则:尽可能控制对数据的修改,如果可以预测某个数据不会或不应该被改变,就要对其控制,而不要期望使用这个数据的调用者不会改变其值. 如果参数在使用过程中被意外修改,将会带来不可预知的结果,而且这种错误很 ...

  8. c# 求两个数中最大的值

    1.三元运算符: class Program { static void Main(string[] args) { ,); Console.WriteLine("最大数:{0}" ...

  9. BOI2007 Mokia | cdq分治求二维点数模板

    题目链接:戳我 也没什么,其实主要就是为了存一个求二维坐标上矩形内点的个数的模板.为了之后咕咕咕地复习使用 不过需要注意的一点是,树状数组传x的时候可千万不要传0了!要不然会一直死循环的...qwqw ...

  10. CF666E Forensic Examination(后缀自动机+动态线段树)

    题意 给你一个串 $S$ 以及一个字符串数组 $T[1..m]$ , $q$ 次询问,每次问 $S$ 的子串 $S[p_l..p_r]$ 在 $T[l..r]$ 中的哪个串里的出现次数最多,并输出出现 ...