胜博发游戏官网编程题:最优平均分配

( 胜博发游戏官网 )

—————大神来看—————


有一串随机的正整数(不考虑大数),然后将这些正整数 ,分配到 N组, 使之 最大的一组 与 最小的一组 两组整数和 差值最小,不需要尽可能解(倒序贪婪,最小贪婪),只求最优解!
例如 30 20 30 20 20
分成n = 2组
1。30 30
2。20 20 20

找最优解,可以看看遗传算法

算法之类的不是很懂,但这是我的一个代码。
我是这样想的。
一个数组内,里面有N+1个整数。
进行冒泡排序出最大的和最小的。
之后循环这个数组去取和。

//冒泡排序出最大和最小
        int temp;
        int[] noneSort = {30, 80, 80, 30, 88, 29, 88, 25, 25};
        for(int i = 0; i < noneSort.length-1; i++){
            for(int j = i + 1; j < noneSort.length; j++){
                temp = noneSort[i];
                if(noneSort[j] >= temp){
                    noneSort[i] = noneSort[j];
                    noneSort[j] = temp;
                }
            }
        }
        //输出打印
        log.info("{}", noneSort);
        int maxNum = noneSort[0];
        int minNum = noneSort[noneSort.length - 1];
        int max = 0, min = 0;
        for(int i = 0; i < noneSort.length; i++){
            if(noneSort[i] == minNum){    //如果等于最小值
                min += noneSort[i];
            }else if(noneSort[i] == maxNum){    //如果等于最大值
                max += noneSort[i];
            }
        }
        //输出打印
        log.info("max: {}, min: {}", max, min);

结果就是如下:

[88, 88, 80, 80, 30, 30, 29, 25, 25]
max: 176, min: 50

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网mac笔记本自带jdk吗?

( 胜博发游戏官网 )

看到/usr/bin/目录下有javac,javah,不知道是不是说不用自己安装jdk1.7了?

推荐用brew case安装

安装homebrew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装brew case

brew tap phinze/homebrew-cask
brew install brew-cask

安装Java

brew cask search java
brew cask install java//替换成搜索到的结果

另外一种简便的方法

如果不想用这类包管理器,在终端下敲java,就会弹出自动安装的提示。当然还是推荐用homebrew和brew case,方便管理osx的软件与应用

你们不要坑新手了好吗?
现在mac不自带jdk了,需要自己安装

还有人点赞了,那我就帮到底了。
最新的jdk是1.8,建议去oracle官网下载,嫌弃速度慢得我丢个百度盘,链接:http://pan.baidu.com/s/1o6sXgdO 下载直接安装即可。

另外还有涉及jdk多版本环境变量管理的话,推荐使用jenv,安装方法出门谷歌谢谢。

很方便。

疯狂点赞吧,骚年们。

带的 但是自带那个不好用 一般都是重新装一个

有自带的,你可以打开控制台输入:java -version 查看版本号。也可以自己安装JDK,并配置好环境变量。

我自己装了个jdk8,建议去oracle官方下载mac版的jdk,还是比较简单的。

建议自己安装,我就是自己装的,不难!

昨天刚买了个 macbook pro,回家安装 webstorm后,打开提示需要安装jdk〜〜

我14年买的 mac air 是不带jdk的。 需要自己安装。

现在的mac已经不带jdk了 很多年前的才是有的
不过在你需要使用到的时候mac会提示 然后点击更多信息可以进入苹果官网下载
苹果官网的版本不是最新的java版本 如果想要下载 可以去java官网进行下载

查看是否安装了java,你只需要在终端中输入java -version命令,如果出现相应的版本信息,比如本人的如下,则说明是存在的,如果没有则说明不存在。

bashJava version "1.7.0_60-ea"
Java(TM) SE Runtime Environment (build 1.7.0_60-ea-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

不存在或者你想安装更高的版本,最简单的方法,下载mac上jdk 的dmg文件,双击安装即可,jdk7下载地址:https://jdk7.java.net/download.html ,jdk8下载地址:https://jdk8.java.net/download.html
详细过程请参考:http://ixirong.com/2015/03/19/the-beginner-of-mac/

Yosemite开始就不自带jdk了

自带的是 jdk 6,推荐用 homebrew

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城关于springmvc扫描Controller类的问题

( sbf胜博发娱乐城 )

运行环境 jdk8 luna spring3.2 mybatis3.2.7
在springmvc.xml中这样写

<context:component-scan base-package="com.lingluo.ssm.controller" />

出现异常
严重: StandardWrapper.Throwable
java.lang.IllegalArgumentException
at org.springframework.asm.ClassReader.(Unknown Source)
at org.springframework.asm.ClassReader.(Unknown Source)
at org.springframework.asm.ClassReader.(Unknown Source)
at org.springframework.core.type.classreading.SimpleMetadataReader.(SimpleMetadataReader.java:52)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:744)

但是这样写

<bean class="com.lingluo.ssm.controller.ItemsController"/>

就没有错误

Spring3.2跟JDK8会有asm classRead问题,建议用spring3+jdk7或者spring4+jdk8

检查一下controller里面的注解呢,要用scan就是要把在xml里面的配置转移到注解中

看样子像缺jar包~~~

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

sbf胜博发娱乐城c# .net 时间格式化,怎样设置英国时区?

( sbf胜博发娱乐城 )

 private static SimpleDateFormat formatter = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z", Locale.ENGLISH);
  String startTime = formatter.format(new Date());//请求时间

能帮我用c#代码写上面这段Java代码吗?

// 查看当前系统支持的所有时区,主要是用 StandardName,
// 不过 ToString() 会显示时间差以及城市,可以帮忙人工判断
// foreach (var z in TimeZoneInfo.GetSystemTimeZones()) {
//   Console.WriteLine($"{z.StandardName} - ${z}");
// }

// 获取英国的时区
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
Console.WriteLine(zone);

Console.WriteLine(DateTime.Now.Kind);     // Local
var gtmTime = TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.Local, zone);
Console.WriteLine(gtmTime);

var d = new DateTime(2015, 9, 1, 18, 0, 0, DateTimeKind.Utc);
Console.WriteLine(d.Kind);    // Utc
Console.WriteLine(TimeZoneInfo.ConvertTime(d, TimeZoneInfo.Utc, zone));

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网如何抽取office文件中的内容进行碎片化存储?

( 胜博发游戏官网 )

Java抽取office文件(word、ppt、excel)中的内容(例如标题、图片、表格等),然后进行碎片化存储,征求可行的技术方案。请考虑到03和07不同的文件格式,POI是个不错的选择,如果还有其他更好的选择请一同分享下。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城写代码格式 括号是否另起一行

( sbf胜博发娱乐城 )

问下大家写代码的格式
写代码最好是另起一行还是不

如果不是否打个空格在写括号如:

int main() {
}没打空格的

int main(){
}打了空格的

大家给点小意见

就如楼上说的那样,怎么写都可以,开心就好。
当然,我们也可以看看一般人家是怎么写的。从对 Github 上面将近190万个Java项目的代码分析结果来看,第一种(即大括号后面空一格)是最多人这么写的

详细分析结果如下:

  1. 大括号后带空格 使用人数占比 58.003 %

    int main() {
    
    }
    
  2. 大括号起新行 使用人数占比 37.06 %

    int main() 
    {
    
    }
    
  3. 大括号后没空格 使用人数占比 4.937 %

    int main(){
    
    }
    

因为我是用PHP的,在PHP世界里面有一个专门的组织叫 PHP Framework Interoperability Group,它就给我们开发人员制定了许多普遍适用的标准,比如包括:代码的书写规范、命名规范等等。我们把该组织制定的标准叫作:PHP Standard Recommendation (PSR)。这些标准有效的减少了我们开发上面遇到的很多常见的困惑。

实际上我们任何人都可以参与制定该标准,而且它也并非官方的组织。但是PHP的官方已经采纳了PSR的部分作为内置的标准了。

楼主也可以看看在Java世界里面,会不会又有这样的组织 (^o^)/

附:以上数据来源自 Popular Coding Convention on Github,统计数据最近更新时间是:2014-07-19

我也问过这个问题诶.
答案就是:如果是团队,一般会有代码规范,遵循便是; 如果是个人,那么按照自己熟悉的来.

在C++中,我倾向于花括号换行.

你觉得怎么写看着舒服就怎么写啦~
在一行,或另起一行的写法都有~

个人比较喜欢同一行加空格的写法。

反正写完最好都要格式化一下,格式化后的一般是另外起一行

普遍的代码风格是,函数的大括号另起一行,其他地方的在同一行

如果是自己学习,可以按自己的习惯来,如果是在公司的话,按公司的编码规范或者大多数人的习惯来写,毕竟自己写的代码也是需要给别人看的

c:

int main()
{

}

java:

public func() {
}

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网【求助】像我这样的需求该怎么配置mybatis事务?????

( 胜博发游戏官网 )

先说一下框架配置
Spring+SpringMVC+mybatis

现在的mybatis的事务级别是jdbc级别(不知道是不是这么叫):就是单条语句执行后提交事务,如果出现异常则回滚!
但是现在经常遇到的问题是:一次操作需要往多个表中插入数据,但是经常在往多个表里面查数据的时候如果其中一张表的插入出现了异常,应该将之前做的所有操作都回滚。例如说
有5个表 A B C D E
只有这5张表插入的数据都成功了,才表明这一次请求成功了!
但是现在如果插到C表时除了异常,那么只会回滚C表这次操作的数据,但是AB这两张表已经插进去了!这样就造成有垃圾数据了!
能不能将这五次操作一并提交事务 ?
不知道该怎样解决像我这样的问题???求大神!

操作一张表使用一个dao的方法,一个业务使用一个service方法,在service里面调用dao,如果某一种业务,要操作5张表,那么在service里面调用5个不同的dao,然后aop配置事务时,切在service层,这样,就会保证这5种操作是同一个事务。

用spring来管理事务,在spring中配置mybatis的事务,service方法级别上加

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void xxxService(xxx xxx){
    //do something
}

整个方法中有异常都会回滚。

将插入五张表封装在service的一个方法里,将Spring事务添加在service层

public class ServiceDemo{
    public void insert(){
        //insert 1
        //insert 2
        //insert 3
        //insert 4
        //insert 5
    }
}

在spring配置文件添加事务管理

xml<bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

dataSource是数据源,你应该已经配置过了,名字可能不一样

在需要使用事务的方法上添加注解,如:

java@Transactional
public void addEntity(Entity entity) {
    XXdao.save(entity);
    YYdao.save(entity);
}

这样只要方法出现运行时异常就会回滚方法内所有的数据库操作。

如果一个类内的所有方法都需要事务管理,可以把@Transactional注解放在类名上面,这样这个类里面所有的方法都支持事务了。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城为什么老年代垃圾回收效率比新生代低很多?

( sbf胜博发娱乐城 )

看过深入理解java虚拟机,书上这个问题以结论性的一句话带过了,面试的时候被问到了这个问题,老年代对象生存时间长,不容易被回收,所以效率低?感觉怪怪的

从年代划分的角度来讲,我觉得问题是本末倒置了,年代划分目的是区别长期存在对象和短时间存在对象。
对象有可能长期存活,所以才会被放入老年代,标记整理过后,由于老年代的对象有很几率继续存活,所有回收的内存少。
新生对象有可能朝生暮死,假如新生对象有80%的概率死亡,经过多轮筛选后,将仍存活的对象存入老年代。那么从这样的流程看来,老年代的对象回收效率果然低。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

SBF胜博发娱乐老虎机IntelliJ IDEA使用emacs keymap如何绑定meta?

( SBF胜博发娱乐老虎机 )

习惯了emacs的快捷键,看到IntelliJ IDEA也提供了emacskeymap。切换到emacskeymap,有一个问题是M-fM-bM-w等都无法使用。Google了一番,看到提供的方案都是重新映射OS X的键盘布局,绑定optionmeta。有没有其他的方案解决这个问题?

最新的版本,配合jdk1.8.0_65已经解决了这个问题

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

胜博发游戏官网【求助】SpringMVC为什么没有拦截到所有请求??

( 胜博发游戏官网 )

我在web.xml中配置了DispatcherServlet 处理所有请求,但是我请求WebRoot下面的某一个文件,还是能请求到啊,如图

这是Web.xml的配置

这是SpringMVC的配置文件

现在在WebRoot的JavaScript文件夹下有一个叫a.txt的文件,既然SpringMVC处理所有请求,我也没在SpringMVC里面配置相应的静态资源映射,那么我在地址栏里面请求这个文件,应该是请求不到的啊
但是事实证明其实还是能请求到的,想问下这是什么情况!
我已经配置了让SpringMVC处理所有请求啊????

求帮忙

太晚了就没做验证,楼主问题大概是在url-pattern里应该是写 /*

虽然你没有配置

<mvc:resources mapping="/images/**" location="/images"/>

类似的静态资源的配置,但是你配置了

<mvc:default-servlet-handler/>

同样有支持静态资源文件访问的功能。会把/** URL注册到SimpleUrlHandlerMapping的urlMap中,把静态资源的访问由HanderMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler处理并返回,DefaultServletHttpRequestHandler使用的就是各个Servlet容器自带的Servlet了, 在DispatcherServlet之前。

<servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机java程序如何和pos机蓝牙通讯

( SBF胜博发娱乐老虎机 )

现在android应用要整合pos机,做到通过pos机刷多少金额,刷卡成功后pos机通知android应用刷卡刷卡成功
有做过相关整合的大神,多多指导~~

这个原理类似. 可以用蓝牙串口通信(做过蓝牙串口SMS群发)

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

SBF胜博发娱乐老虎机CAS 单点登录服务端 如何获取到principal

( SBF胜博发娱乐老虎机 )

1、deployerConfigContext.xml文件
1.1 登录验证类配置

<!--自定义类,继承自AbstractUsernamePasswordAuthenticationHandler用来进行登录验证-->
<bean id="primaryAuthenticationHandler"
 class="com.alan.cas.control.authentication.SessionAcceptUserAuthenticationHandler">
        <property name="users">
            <map>
                <entry key="admin" value="admin"/>
            </map>
        </property>
        <property name="systemUserService" ref="systemUserService"/>
 </bean>
 

1.2凭证解析类配置(给客户端返回更多的信息)

<!-- 凭证解析 -->
<bean id="primaryPrincipalResolver"           class="com.alan.cas.service.credential.impl.SessionPersonDirectoryPrincipalResolver" p:principalFactory-ref="principalFactory" p:attributeRepository-ref="attributeRepository">
      <property name="systemUserDao" ref="systemUserDao"/>
      <property name="proxyPrincipalResolver" ref="proxyPrincipalResolver"/>
</bean>


2.登录验证成功后,我把一些信息保存在principal中,希望在解析类中获取到,但是却不能获取到。希望大神们能帮我分析一下。

2.1登录验证成功后,把信息保存在principal中的代码如下。

@Override
protected final HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential)
        throws GeneralSecurityException, PreventedException {
    Long userId = null;
    String username = null;
    String password = null;
    try {
        UserDTO dto = new UserDTO();
        username = credential.getUsername();
        password = credential.getPassword();
        dto.setSysCode(username);
        dto.setPasswd(password);
        logger.info("{} 尝试登录验证中心。", username);
        userId = systemUserService.check(dto);
    } catch(GeneralSecurityException e) {
        logger.info("{} 登录验证中心失败,原因是{}。", username, e.getMessage()); 
        throw e;
    } catch(Exception e) {
        logger.error("{} 登录验证出错了,原因是{}。", username, e.getMessage()); 
        throw new FailedLoginException();
    }       
    logger.info("{} 登录验证中心成功,userId为{}。", username, userId);
    Map<String,Object> map = new HashMap<String, Object>();
    map.put("userId", userId);
    //我该如何在解析凭证类中获取这个Pricipal。
    Principal p = this.principalFactory.createPrincipal(username,map);
    return createHandlerResult(credential, p, null);
}

2.2在解析凭证类中,获取不到principal,如下

@Override
    public final Principal resolve(final Credential credential) {
        String userName = credential.getId();//获取用户名
        final IPersonAttributes personAttributes = attributeRepository.getPerson(principalId);
        if (principalId == null) {
            logger.info("用户名为空");
            return null;
        }
        //返回信息的载体
        final Map<String, Object> convertedAttributes = new HashMap<String, Object>();
        
        //因为credential.getId()返回的是username。所以我这里需要再查一次数据库
        //就是在这里获取不到principal对象,不知道如何获取 ,或者有其他的方法可行?
        SystemUser user = systemUserDao.getUserByName(userName);
        convertedAttributes.put("userId",user.getSysUserId());
        return this.principalFactory.createPrincipal(principalId, convertedAttributes);
    }
    
    

3、谢谢各位的解惑!

SecurityContextHolder.getContext()
                    .getAuthentication().getPrincipal()

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

胜博发游戏官网ssm配置的一个问题

( 胜博发游戏官网 )

<bean id=”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactoryBean”>

    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:mybatis.xml" />
    <!-- mapper和resultmap配置路径 -->
    <property name="mapperLocations">
        <list>
            <value>classpath:entity/config/*.xml</value>
        </list>
    </property>
</bean>
<!-- 自动扫描mapper接口,注入sqlsessionfactory -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="org.xdemo.example.springrestful.mapper" />
</bean>

Mapper接口是怎么样注入到sqlsessionfactory里的啊?

你下面的加个
<property name=”sqlSessionFactoryBeanName” value=”sqlSessionFactory”></property>

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机java的中断线程interrupt()方法,为什么还要把run()方法走完呢?那中断线程不就没有意义了吗?

( SBF胜博发娱乐老虎机 )

当线程调用interrupt方法后,为什么还要运行完run方法呢?那中断线程还有什么意义?

Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。这好比是家里的父母叮嘱在外的子女要注意身体,但子女是否注意身体,怎么注意身体则完全取决于自己。

详细分析Java中断机制

Java线程也有一个不让run方法走完的方式,那就是stop方法,可是这个方法已经被jdk弃用了,为什么呢?如果你的线程正在修改某处数据,可以是数据库,可以是写文件,stop方法不由分说就把线程杀死了,那数据是不是就出现混乱,不一致的状况?所以Java的线程采用的是中断机制,并且你可以捕获这个中断,并作出中断后需要做出的操作。

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

SBF胜博发娱乐老虎机java AtomicInteger线程安全问题

( SBF胜博发娱乐老虎机 )

public class TTTT implements Runnable{

public static AtomicInteger ato = new AtomicInteger(1);
int i = 1;
public static void main(String[] args) {
    TTTT t = new TTTT();
    for (int i = 0;i<100; i++){
        new Thread(t).start();
    }
}

public void rrrr() throws Exception{
    Thread.sleep(100);
    int preVal = ato.get();
    int val = ato.incrementAndGet();
    System.out.println(preVal+" ########### "+val);
}

@Override public void run() {
    try {
        rrrr();
    } catch (Exception e){

    }
}

}

AtomicInteger 的incrementAndGet是线程安全的计数方法
上面代码执行结果是:

1 ########### 4
5 ########### 6
1 ########### 3
9 ########### 10
9 ########### 11
13 ########### 14
16 ########### 18
1 ########### 2
8 ########### 9
6 ########### 7
4 ########### 5
7 ########### 8
18 ########### 19
16 ########### 17
14 ########### 15
15 ########### 16
12 ########### 13
11 ########### 12
19 ########### 21
21 ########### 22
22 ########### 23
19 ########### 20
23 ########### 24
24 ########### 25

无法保证顺序,线程安全体现在哪里呢

AtomicInteger 的incrementAndGet 保证对整数的递增和获取是原子的,

  1. 值+1

  2. 返回值

一个线程在这两个操作之间不会强行插入另外的线程

你要保证顺序,那么需要的是线程互斥

你输出的右边不会重复也不会漏,这就是它的线程安全保证

AtomicInteger是一个原子类,顾名思义,它能保证一些操作是原子性的,比如说++、--等操作,这些操作在多线程的情况并不是线程安全的,但是使用原子类可以保证这些操作的原子性,从而来保证线程的安全性。

简单说说吧。

  1. 线程安全是在多线程环境下,数据的增加和减少是安全的,例子中数据不重复就代表了线程安全了。
    2.顺序问题是有线程执行的顺序决定的,和线程安全没关系

直接上代码,你用线程池当中的Executors.newSingleThreadExecutor();代码如下:

package test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class TestAtomicInteger implements Runnable{
    public static AtomicInteger atomic = new AtomicInteger();
    int i = 0;
    @Override
    public void run(){
        try {
            Thread.sleep(100);
            int preVal = atomic.get();
            int val = atomic.incrementAndGet();
            System.out.println(preVal+" ########### "+val);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        TestAtomicInteger test = new TestAtomicInteger();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        for(int i = 0;i < 100; i++){
            executor.execute(test);
        }
    }
}

输出结果如下:
0 ########### 1
1 ########### 2
2 ########### 3
3 ########### 4
4 ########### 5
5 ########### 6
6 ########### 7
7 ########### 8
8 ########### 9
9 ########### 10
10 ########### 11
11 ########### 12
12 ########### 13
13 ########### 14
14 ########### 15
15 ########### 16
16 ########### 17
17 ########### 18
18 ########### 19
19 ########### 20
20 ########### 21
21 ########### 22
22 ########### 23
23 ########### 24
24 ########### 25
25 ########### 26
26 ########### 27
27 ########### 28
28 ########### 29
29 ########### 30
30 ########### 31
31 ########### 32
32 ########### 33
33 ########### 34
34 ########### 35
35 ########### 36
36 ########### 37
37 ########### 38
38 ########### 39
39 ########### 40
40 ########### 41
41 ########### 42
42 ########### 43
43 ########### 44
44 ########### 45
45 ########### 46
46 ########### 47
47 ########### 48
48 ########### 49
49 ########### 50
50 ########### 51
51 ########### 52
52 ########### 53
53 ########### 54
54 ########### 55
55 ########### 56
56 ########### 57
57 ########### 58
58 ########### 59
59 ########### 60
60 ########### 61
61 ########### 62
62 ########### 63
63 ########### 64
64 ########### 65
65 ########### 66
66 ########### 67
67 ########### 68
68 ########### 69
69 ########### 70
70 ########### 71
71 ########### 72
72 ########### 73
73 ########### 74
74 ########### 75
75 ########### 76
76 ########### 77
77 ########### 78
78 ########### 79
79 ########### 80
80 ########### 81
81 ########### 82
82 ########### 83
83 ########### 84
84 ########### 85
85 ########### 86
86 ########### 87
87 ########### 88
88 ########### 89
89 ########### 90
90 ########### 91
91 ########### 92
92 ########### 93
93 ########### 94
94 ########### 95
95 ########### 96
96 ########### 97
97 ########### 98
98 ########### 99
99 ########### 100

Atomic类中的value值都是一些被volatile标注的类型, volatile是java提供的轻量级变量同步机制,它确保了变量可见性,即任何一个线程修改了volatile修饰的变量,其他线程将立即可见.对于普通变量因为存在主内存和工作区内存的复制和同步,所以无法具备此特性.volatile变量存储在主内中,任何线程需要使用此变量时,必须再次read,因为其他线程对此变量的更改,将会被其他线程在使用此变量时立即获得新值.
volatile只是保证了可见性,但是它并非线程安全,因为如果线程一旦read到此值然后进行计算,在尚未write到主内存时其他线程也做了同样的操作,那么volatile变量的最终结果将无法达到预期..如果期望volatile变量线程安全,必须同步或者CAS.volatile变量操作时,read->load->use三个操作是连续的,assign->store->write三个操作是连续的.
里面采用的是CAS(compareAndSet)的值替换方法,像一种”乐观锁”,通过”比较”-“更新”这种无阻塞的手段实现数据在多线程下的”安全性”.

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

sbf胜博发娱乐城runnable是如何避免java单继承带来的局限性的?

( sbf胜博发娱乐城 )

单继承的意思是,一个子类不能有两个以上父类
具体解释:
若有一个A类,一个B类,且A,B类独立(没有共同父类,也相互不为父类)。
新建一个类C,想要同时继承A,B类,在JAVA中无法直接实现。
要实现,只能复制A类的内容,再继承B类,或者反过来,这将会很麻烦,而且代码会很丑陋。

局限性由上面可以得到:想要得到两个类的特性是不能通过继承实现。

而接口出现可以解决这个问题。
因为,一个类可以实现多个接口

最后解释一下Runnable是如何避免java单继承带来的局限性的。
如果你想写一个类C,但这个类C已经继承了一个类A,此时,你又想让C实现多线程。用继承Thread类的方式不行了。(因为单继承的局限性)
此时,只能用Runnable接口。
Runnable接口就是为了解决这种情境出现的。

runnable是接口

可以实现多个接口

@RK3258 其实还是介绍的接口实现类继承的区别,我从另外一个层面来回答这个问题。

首先 ThreadRunnable 实际上是一种静态代理的实现方式。我们可以简单看一下源代码就了解了:

public interface Runnable {
    public abstract void run();
}

public class Thread implements Runnable {
    ...
    private Runnable target;
    public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }
    public void run() {
        if (target != null) {
            target.run(); //代理的target的run方法
        }
    }
}

另外一个我们知道线程启动是调用 thread.start() 方法,但是 start() 方法会调用 nativestart0()方法,继而由 JVM 来实现多线程的控制,因为需要系统调用来控制时间分片。

现在我们可以深入理解一下两种线程实现方式的异同。

Class MyThread extends Thread(){
    public int count = 10;
    public synchronized void run(){
        while(count>0){
            count--;
        }
    } 
}

new Mythread().start(); //启动 n 个线程
new Mythread().start();

这种实现方式实际上是重写了 run() 方法,由于线程的资源和 Thread 实例捆绑在一起,所以不同的线程的资源不会进行共享。

Class MyThread implements Runnable{
    public int count = 10;
    public synchronized void run(){
        while(count>0){
            count--;
        }
    } 
}
MyThread mt = new MyThread();
new Thread(mt).start();  //启动 n 个线程
new Thread(mt).start();

这种实现方式就是静态代理的方式,线程资源与 Runable 实例捆绑在一起Thread 只是作为一个代理类,所以资源可以进行共享。

当然 @RK3258 说的接口与类的区别我就不赘述了。

另外从 Java 语言设计者的角度来说,Runnable 可以理解为 Task,对应的是具体的要运行的任务,而 Thread 对应某一个具体的线程运行的载体。综上,继承 Thread 来实现,可以说是不推荐的。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网SWT 从线程中打开一个Shell的问题(在子线程中无法开启一个新的shell)

( 胜博发游戏官网 )

描述:我想制作一个不阻塞线程的弹出框,所以自定义了一个Dialog,继承Dialog并实现Runnable接口。

将display作为参数传入后,获得parent shell,并实例化child shell,以此shell创建dialog。

/**
     * Create the dialog.
     * @param parentShell
     */
    private ShowLoadingDialog(Shell parentShell) {
        super(parentShell);
        
    
        this.shell = parentShell;
        this.display = shell.getDisplay();
        label = new Label(shell, SWT.NONE);
    }
    
    public static ShowLoadingDialog getDialog(Display display){
        Shell shell = new Shell(display,SWT.TITLE | SWT.BORDER|SWT.APPLICATION_MODAL);
        return new ShowLoadingDialog(shell);
    }

定义一个open方法,当调用此方法时,会执行自身这个Runnable对象,我把shell的open放在了线程中启动,当收到关闭shell的通知时(isShow),结束线程


@Override
    public void run() {
        // TODO Auto-generated method stub        
        
            if(this.show){
                display.syncExec(new Runnable() {
                    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        shell.open();
                        shell.layout();
                        while  ( ! shell.isDisposed() && isShow) {  
                                if  ( ! display.readAndDispatch()) ; 
                                display.sleep();  
                         }  
                    }
                });
            }
    }

Q1: 为什么无论我使用syscExec方法还是asyscExec方法,都无法显示出dialog
Q2:为什么将shell的open方法调用从run中移出来调用时,能显示出dilog但是程序会失去响应
(dialog的样式和坐标我已经在别的方法中设置好了,无需考虑着一点)

我已经找到解决的办法了,忘了更新:
关于在使用Java的SWT开发UI时UI总是发生卡死的情况及解决办法

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机LinkedBlockingQueue 阻塞问题

( SBF胜博发娱乐老虎机 )

当用LinkedBlockingQueue的take()方法获取队列信息时

一旦队列为空,则进入阻塞状态

再往队列里put()元素,take()方法会自动获取新加入元素,还是始终保持阻塞状态?

自动获取,不会阻塞了

如果还是阻塞,这个类还有什么用?

建议看看源码,就知道了,很有好处的

@wxmimperio 你采纳的答案是错误的。ConcurrentLinkedQueue是不阻塞的,LinkedBlockingQueue是阻塞的。分别给你上代码:如下:

import java.util.concurrent.LinkedBlockingQueue;
public class TestLinkedBlockingQueue {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
        try {
            queue.put("a");
            queue.put("b");
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
            queue.put("c");
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
//输出结果:
//a
//b

但是你再看非阻塞的ConcurrentLinkedQueue

import java.util.concurrent.ConcurrentLinkedQueue;
public class TestConcurrentLinkedQueue {
    public static void main(String[] args) {
        ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
        queue.add("a");
        queue.add("b");
        System.out.println(queue.peek());
        queue.remove();
        System.out.println(queue.peek());
        queue.remove();
        System.out.println(queue.peek());
        queue.remove();
        queue.add("c");
        System.out.println(queue.peek());
        queue.remove();
    }
}
//a
//b
//null
//Exception in thread "main" java.util.NoSuchElementException
//    at java.util.AbstractQueue.remove(AbstractQueue.java:117)
//    at TestConcurrentLinkedQueue.main(TestConcurrentLinkedQueue.java:14)

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

胜博发游戏官网java工作两年想转成产品,不知好不好转?

( 胜博发游戏官网 )

java工作两年想转成产品,不知好不好转?

这个问题已被关闭,原因:dfsyh

两者方向完全不同,既然不打算今后搞技术应当早作转型。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…